2016-07-08 35 views
-2

Ich denke, das Problem ist, wie ich die Referrer-Methode einstelle. Die Funktion wird richtig aufgerufen, denke ich.Ändern des Parameters der virtuellen Methode ohne Erweitern der Klasse C++

SimpleHandler Klasse:

Was die Sache für meine Bedenken sind die folgenden zwei Funktionen:

// Return the handler for browser request events. 
    /// 
    /*--cef()--*/ 
CefRefPtr<CefRequestHandler> GetRequestHandler() override { 
     return this; 
     } 


virtual CefRequestHandler::ReturnValue OnBeforeResourceLoad(
      CefRefPtr<CefBrowser> browser, 
      CefRefPtr<CefFrame> frame, 
      CefRefPtr<CefRequest> request, 
      CefRefPtr<CefRequestCallback> callback) OVERRIDE; 

Wenn es Problem ist entweder mit der oben in der unten Klasse lass es mich wissen.

class SimpleHandler : public CefClient, 
         public CefDisplayHandler, 
         public CefLifeSpanHandler, 
         public CefLoadHandler, 
      public CefRequestHandler{ 
public: 
    explicit SimpleHandler(bool use_views); 
    ~SimpleHandler(); 

    // Provide access to the single global instance of this object. 
    static SimpleHandler* GetInstance(); 

    // CefClient methods: 
    virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE { 
    return this; 
    } 
    virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE { 
    return this; 
    } 
    virtual CefRefPtr<CefLoadHandler> GetLoadHandler() OVERRIDE { 
    return this; 
    } 

virtual CefRefPtr<CefRequestHandler> GetRequestHandler() OVERRIDE { 
    return this; 
    } 

    // CefDisplayHandler methods: 
    virtual void OnTitleChange(CefRefPtr<CefBrowser> browser, 
          const CefString& title) OVERRIDE; 

    // CefLifeSpanHandler methods: 
    virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE; 
    virtual bool DoClose(CefRefPtr<CefBrowser> browser) OVERRIDE; 
    virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE; 

    // CefLoadHandler methods: 
    virtual void OnLoadError(CefRefPtr<CefBrowser> browser, 
          CefRefPtr<CefFrame> frame, 
          ErrorCode errorCode, 
          const CefString& errorText, 
          const CefString& failedUrl) OVERRIDE; 

    // Request that all existing browser windows close. 
    void CloseAllBrowsers(bool force_close); 

    bool IsClosing() const { return is_closing_; } 



virtual CefRequestHandler::ReturnValue OnBeforeResourceLoad(
     CefRefPtr<CefBrowser> browser, 
     CefRefPtr<CefFrame> frame, 
     CefRefPtr<CefRequest> request, 
     CefRefPtr<CefRequestCallback> callback) OVERRIDE; 


private: 
    // Platform-specific implementation. 
    void PlatformTitleChange(CefRefPtr<CefBrowser> browser, 
          const CefString& title); 

    // True if the application is using the Views framework. 
    const bool use_views_; 

    // List of existing browser windows. Only accessed on the CEF UI thread. 
    typedef std::list<CefRefPtr<CefBrowser> > BrowserList; 
    BrowserList browser_list_; 

    bool is_closing_; 

    // Include the default reference counting implementation. 
    IMPLEMENT_REFCOUNTING(SimpleHandler); 
}; 

#endif // CEF_TESTS_CEFSIMPLE_SIMPLE_HANDLER_H_ 

Wie kann ich die OnBeforeResourceLoad Funktion (von simple_handler.cc Datei) nennen:

CefRequestHandler::ReturnValue SimpleHandler::OnBeforeResourceLoad(
     CefRefPtr<CefBrowser> browser, 
     CefRefPtr<CefFrame> frame, 
     CefRefPtr<CefRequest> request, 
     CefRefPtr<CefRequestCallback> callback) 

{ 

CefRequest::ReferrerPolicy origin = REFERRER_POLICY_ALWAYS; 
request->SetReferrer("www.google.com",origin); 


    return RV_CONTINUE; 

} 

Die setpreferrer Methode I Verhalten zu ändern, bin mit:

/// 
    // Set the referrer URL and policy. If non-empty the referrer URL must be 
    // fully qualified with an HTTP or HTTPS scheme component. Any username, 
    // password or ref component will be removed. 
    /// 
    /*--cef()--*/ 
    virtual void SetReferrer(const CefString& referrer_url, 
          ReferrerPolicy policy) =0; 

Klasse mit den SetReferrer Methode.

[1]: http://magpcss.org/ceforum/apidocs/projects/%28default%29/cef_request_handler.h.html 
+1

http://stackoverflow.com/help/mcve – kfsone

Antwort

0

Es sollte Klasse sein, die CefClient-Schnittstelle implementiert. Diese Klasse sollte Methode überschreiben

/// 
// Return the handler for browser request events. 
/// 
/*--cef()--*/ 
virtual CefRefPtr<CefRequestHandler> GetRequestHandler() { 
    return NULL; 
} 

GetRequestHandler sollten tatsächliche CefRequestHandler mit überschriebene OnBeforeResourceLoad Methode zurück, die Sie bereits geschrieben haben.

Es kann wie folgt aussehen:

class MyCefClient : public CefClient, public CefRequestHandler { 
public: 

    CefRefPtr<CefRequestHandler> GetRequestHandler() override { 
    return this; 
    } 

    ReturnValue OnBeforeResourceLoad(
     CefRefPtr<CefBrowser> browser, 
     CefRefPtr<CefFrame> frame, 
     CefRefPtr<CefRequest> request, 
     CefRefPtr<CefRequestCallback> callback) override { 

    // write your code here 

    return RV_CONTINUE; 
    } 
}; 

Es gibt eine Klasse SimpleHandler im CefSimple Beispiel. Sie können den Code dort oben hinzufügen.

+0

Vielen Dank für Ihre Kommentare. Ich habe Ihre Änderungen implementiert, bin aber immer noch nicht in der Lage, den Referrer festzulegen. Ich habe die Methode "getrequesthandler()" in meine SimpleHandler-Klasse eingefügt, aber es hat leider keine Änderungen ergeben. Irgendwelche anderen Gedanken würden geschätzt werden. Ich bin auch auf dem CEF-Forum erreichen – michael275

+0

musste alles neu installieren. das funktioniert, ich schätze die Hilfe wirklich. – michael275