CefSchemeHandlerFactoryを継承して、CefRegisterSchemeHandlerFactoryでURLが与えられたときの処理を独自に実装して与えてやることで、自分で定義したHTMLテキストを与えられる。
static std::u8string GetAppHtml_Hello() { return u8R"( <!doctype html> <html> <head><meta charset="utf-8"><title>Local HTML</title></head> <body style="background-color:#CCCCCC;"> <h1>こんにちは</h1> </body> </html> )"; } static std::u8string GetAppHtml_Img() { return u8R"( <!doctype html> <html> <head><meta charset="utf-8"><title>Local HTML</title></head> <body style="background-color:#CCCCCC;"> <img src="https://www.google.com/logos/doodles/2025/seasonal-holidays-2025-6753651837110711.2-law.gif" alt="My Image" /> </body> </html> )"; } // CefStreamResourceHandlerに必要 #include <include/wrapper/cef_stream_resource_handler.h>
class MySchemeHandlerFactory : public CefSchemeHandlerFactory { public: CefRefPtr<CefResourceHandler> Create(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& scheme_name, CefRefPtr<CefRequest> request) override { std::u8string myhtml; // URL に応じて返す内容を設定 const std::string url = request->GetURL(); if (url == "myapp://mylocalhtml/hello.html") { myhtml = GetAppHtml_Img(); } else if (url == "myapp://mylocalhtml/img.html") { myhtml = GetAppHtml_Hello(); } else { // その他の URL はデフォルトに任せる return nullptr; } // HTMLデータを CefStreamReader に変換 CefRefPtr<CefStreamReader> stream = CefStreamReader::CreateForData( (void*)myhtml.data(), static_cast<size_t>(myhtml.size())); // mime_type を text/html にしてハンドラ作成 return new CefStreamResourceHandler("text/html", stream); } private: IMPLEMENT_REFCOUNTING(MySchemeHandlerFactory); };
void SetHTML(CefRefPtr<CefBrowser> browser) { // 本来ならどこかで一回だけ登録すればよい CefRegisterSchemeHandlerFactory( "myapp", "mylocalhtml", new MySchemeHandlerFactory()); CefRefPtr<CefFrame> frame = browser->GetMainFrame(); static int count = 0; count++; if (count % 2 == 0) { frame->LoadURL(CefString("myapp://mylocalhtml/hello.html")); } else { frame->LoadURL(CefString("myapp://mylocalhtml/img.html")); } // 他のURLは通常動作 //frame->LoadURL(CefString("https://www.suzulang.com/")); }
