Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit a3b4606

Browse files
author
Ian Macphail
committed
[[ libbrowser ]] Fix url callbacks sent when setting html in CEF browser
This patch fixes a bug where url progress callbacks were being sent for pages loaded by setting the html text of the browser, if the call to set the html was immediately followed by a request to load a url.
1 parent 3779ac7 commit a3b4606

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

libbrowser/src/libbrowser_cef.cpp

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -760,13 +760,12 @@ class MCCefBrowserClient : public CefClient, CefLifeSpanHandler, CefRequestHandl
760760
MCCefMessageResult m_message_result;
761761
std::map<int64_t, MCCefErrorInfo> m_load_error_frames;
762762

763-
// IM-2014-05-06: [[ Bug 12384 ]] Set of URLs for which callback messages will not be sent
764-
std::set<CefString> m_ignore_urls;
763+
// Describes where loading url requests came from
764+
std::map<CefString, PageOrigin> m_load_url_origins;
765765

766766
CefString m_last_request_url;
767767

768768
PageOrigin m_displayed_page_origin;
769-
PageOrigin m_loading_page_origin;
770769

771770
// Error handling - we need to keep track of url that failed to load in a
772771
// frame so we can send the correct url in onLoadEnd()
@@ -826,7 +825,7 @@ class MCCefBrowserClient : public CefClient, CefLifeSpanHandler, CefRequestHandl
826825
{
827826
m_owner = p_owner;
828827
m_browser_id = 0;
829-
m_displayed_page_origin = m_loading_page_origin = PageOrigin::kNone;
828+
m_displayed_page_origin = PageOrigin::kNone;
830829
}
831830

832831
// IM-2014-07-21: [[ Bug 12296 ]] Method to allow owner to notify client of its deletion
@@ -843,28 +842,24 @@ class MCCefBrowserClient : public CefClient, CefLifeSpanHandler, CefRequestHandl
843842
virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler() OVERRIDE { return this; }
844843
virtual CefRefPtr<CefDragHandler> GetDragHandler() OVERRIDE { return this; }
845844

846-
void AddIgnoreUrl(const CefString &p_url)
845+
void AddLoadingUrl(const CefString &p_url, PageOrigin p_origin)
847846
{
848-
m_ignore_urls.insert(p_url);
847+
m_load_url_origins[p_url] = p_origin;
849848
}
850849

851-
void RemoveIgnoreUrl(const CefString &p_url)
850+
void RemoveLoadingUrl(const CefString &p_url)
852851
{
853-
m_ignore_urls.erase(p_url);
852+
m_load_url_origins.erase(p_url);
854853
}
855854

856-
// IM-2014-05-06: [[ Bug 12384 ]] Test if callback should be sent for URL
857-
bool IgnoreUrl(const CefString &p_url)
855+
bool GetLoadingUrlOrigin(const CefString &p_url, PageOrigin &r_origin)
858856
{
859-
std::set<CefString>::iterator t_iter;
860-
t_iter = m_ignore_urls.find(p_url);
861-
862-
return t_iter != m_ignore_urls.end();
863-
}
864-
865-
void SetLoadingPageOrigin(PageOrigin p_origin)
866-
{
867-
m_loading_page_origin = p_origin;
857+
auto t_iter = m_load_url_origins.find(p_url);
858+
if (t_iter == m_load_url_origins.end())
859+
return false;
860+
861+
r_origin = t_iter->second;
862+
return true;
868863
}
869864

870865
PageOrigin GetDisplayedPageOrigin()
@@ -1036,10 +1031,17 @@ class MCCefBrowserClient : public CefClient, CefLifeSpanHandler, CefRequestHandl
10361031
CefString t_url;
10371032
t_url = p_request->GetURL();
10381033

1034+
PageOrigin t_origin = PageOrigin::kNone;
1035+
10391036
if (p_user_gesture)
1040-
SetLoadingPageOrigin(PageOrigin::kBrowse);
1037+
{
1038+
t_origin = PageOrigin::kBrowse;
1039+
/* UNCHECKED */ AddLoadingUrl(t_url, t_origin);
1040+
}
1041+
else
1042+
/* UNCHECKED */ GetLoadingUrlOrigin(t_url, t_origin);
10411043

1042-
if (IgnoreUrl(t_url))
1044+
if (t_origin == PageOrigin::kSetSource)
10431045
return false;
10441046

10451047
char *t_url_str;
@@ -1061,7 +1063,10 @@ class MCCefBrowserClient : public CefClient, CefLifeSpanHandler, CefRequestHandl
10611063
CefString t_url;
10621064
t_url = p_request->GetURL();
10631065

1064-
if (IgnoreUrl(t_url))
1066+
PageOrigin t_origin = PageOrigin::kNone;
1067+
/* UNCHECKED */ GetLoadingUrlOrigin(t_url, t_origin);
1068+
1069+
if (t_origin == PageOrigin::kSetSource)
10651070
return RV_CONTINUE;
10661071

10671072
m_last_request_url = t_url;
@@ -1172,10 +1177,13 @@ class MCCefBrowserClient : public CefClient, CefLifeSpanHandler, CefRequestHandl
11721177
bool t_frame;
11731178
t_frame = !p_frame->IsMain();
11741179

1180+
PageOrigin t_origin = PageOrigin::kNone;
1181+
/* UNCHECKED */ GetLoadingUrlOrigin(t_url, t_origin);
1182+
11751183
if (!t_frame && !t_is_error)
1176-
m_displayed_page_origin = m_loading_page_origin;
1184+
m_displayed_page_origin = t_origin;
11771185

1178-
if ((!t_frame && m_loading_page_origin==PageOrigin::kSetSource) || IgnoreUrl(t_url))
1186+
if (!t_frame && t_origin == PageOrigin::kSetSource)
11791187
return;
11801188

11811189
char *t_url_str;
@@ -1212,7 +1220,11 @@ class MCCefBrowserClient : public CefClient, CefLifeSpanHandler, CefRequestHandl
12121220
bool t_frame;
12131221
t_frame = !p_frame->IsMain();
12141222

1215-
if ((!t_frame && m_loading_page_origin == PageOrigin::kSetSource) || IgnoreUrl(t_url))
1223+
PageOrigin t_origin = PageOrigin::kNone;
1224+
/* UNCHECKED */ GetLoadingUrlOrigin(t_url, t_origin);
1225+
/* UNCHECKED */ RemoveLoadingUrl(t_url);
1226+
1227+
if (!t_frame && t_origin == PageOrigin::kSetSource)
12161228
return CefLoadHandler::OnLoadEnd(p_browser, p_frame, p_http_status_code);
12171229

12181230
char *t_url_str;
@@ -1302,7 +1314,7 @@ bool MCCefBrowserBase::Initialize()
13021314
CefString t_url("data:text/html;charset=utf-8,");
13031315

13041316
// IM-2014-05-06: [[ Bug 12384 ]] Prevent callback messages for dummy URL
1305-
m_client->SetLoadingPageOrigin(MCCefBrowserClient::PageOrigin::kSetSource);
1317+
m_client->AddLoadingUrl(t_url, MCCefBrowserClient::PageOrigin::kSetSource);
13061318
PlatformConfigureWindow(t_window_info);
13071319

13081320
if (MC_CEF_USE_MULTITHREADED_MESSAGELOOP)
@@ -1620,7 +1632,7 @@ bool MCCefBrowserBase::LoadHTMLText(const char *p_htmltext, const char *p_base_u
16201632
if (!MCCefStringFromUtf8String(p_base_url, t_base_url))
16211633
return false;
16221634

1623-
m_client->SetLoadingPageOrigin(MCCefBrowserClient::PageOrigin::kSetSource);
1635+
m_client->AddLoadingUrl(t_base_url, MCCefBrowserClient::PageOrigin::kSetSource);
16241636
m_browser->GetMainFrame()->LoadString(t_htmltext, t_base_url);
16251637

16261638
return true;
@@ -1832,7 +1844,7 @@ bool MCCefBrowserBase::GoToURL(const char *p_url)
18321844
if (!MCCefStringFromUtf8String(p_url, t_url))
18331845
return false;
18341846

1835-
m_client->SetLoadingPageOrigin(MCCefBrowserClient::PageOrigin::kSetUrl);
1847+
m_client->AddLoadingUrl(t_url, MCCefBrowserClient::PageOrigin::kSetUrl);
18361848

18371849
t_frame->LoadURL(t_url);
18381850
return true;

0 commit comments

Comments
 (0)