diff --git a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h index fb32cc728a..861dc9dc50 100644 --- a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h +++ b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h @@ -113,6 +113,8 @@ public: void parentHierarchyChanged() override; /** @internal */ void visibilityChanged() override; + /** @internal */ + void focusGained (FocusChangeType) override; private: //============================================================================== diff --git a/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp index d449bae366..532b907776 100644 --- a/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp @@ -107,3 +107,7 @@ void WebBrowserComponent::visibilityChanged() { checkWindowAssociation(); } + +void WebBrowserComponent::focusGained (FocusChangeType) +{ +} diff --git a/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp index 5aafe3a6a7..43f5e79cdd 100644 --- a/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp @@ -112,3 +112,7 @@ void WebBrowserComponent::visibilityChanged() { checkWindowAssociation(); } + +void WebBrowserComponent::focusGained (FocusChangeType) +{ +} diff --git a/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm b/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm index 732665cf09..58c07d64e1 100644 --- a/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm +++ b/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm @@ -24,11 +24,11 @@ #if JUCE_MAC -struct DownloadClickDetectorClass : public ObjCClass +struct DownloadClickDetectorClass : public ObjCClass { - DownloadClickDetectorClass() : ObjCClass ("JUCEWebClickDetector_") + DownloadClickDetectorClass() : ObjCClass ("JUCEWebClickDetector_") { - addIvar ("owner"); + addIvar ("owner"); addMethod (@selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener:), decidePolicyForNavigationAction, "v@:@@@@@"); @@ -54,7 +54,7 @@ private: } static void decidePolicyForNavigationAction (id self, SEL, WebView*, NSDictionary* actionInformation, - NSURLRequest*, WebFrame*, id listener) + NSURLRequest*, WebFrame*, id listener) { if (getOwner (self)->pageAboutToLoad (getOriginalURL (actionInformation))) [listener use]; @@ -63,7 +63,7 @@ private: } static void decidePolicyForNewWindowAction (id self, SEL, WebView*, NSDictionary* actionInformation, - NSURLRequest*, NSString*, id listener) + NSURLRequest*, NSString*, id listener) { getOwner (self)->newWindowAttemptingToLoad (getOriginalURL (actionInformation)); [listener ignore]; @@ -109,7 +109,7 @@ private: } // (juce namespace) //============================================================================== -@interface WebViewTapDetector : NSObject +@interface WebViewTapDetector : NSObject { } @@ -130,7 +130,7 @@ private: @end //============================================================================== -@interface WebViewURLChangeDetector : NSObject +@interface WebViewURLChangeDetector : NSObject { juce::WebBrowserComponent* ownerComponent; } @@ -216,37 +216,45 @@ public: const StringArray* headers, const MemoryBlock* postData) { - NSMutableURLRequest* r - = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: juceStringToNS (url)] - cachePolicy: NSURLRequestUseProtocolCachePolicy - timeoutInterval: 30.0]; - - if (postData != nullptr && postData->getSize() > 0) - { - [r setHTTPMethod: nsStringLiteral ("POST")]; - [r setHTTPBody: [NSData dataWithBytes: postData->getData() - length: postData->getSize()]]; - } - - if (headers != nullptr) - { - for (int i = 0; i < headers->size(); ++i) - { - const String headerName ((*headers)[i].upToFirstOccurrenceOf (":", false, false).trim()); - const String headerValue ((*headers)[i].fromFirstOccurrenceOf (":", false, false).trim()); - - [r setValue: juceStringToNS (headerValue) - forHTTPHeaderField: juceStringToNS (headerName)]; - } - } - stop(); - #if JUCE_MAC - [[webView mainFrame] loadRequest: r]; - #else - [webView loadRequest: r]; - #endif + if (url.trimStart().startsWithIgnoreCase ("javascript:")) + { + [webView stringByEvaluatingJavaScriptFromString: + juceStringToNS (url.fromFirstOccurrenceOf (":", false, false))]; + } + else + { + NSMutableURLRequest* r + = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: juceStringToNS (url)] + cachePolicy: NSURLRequestUseProtocolCachePolicy + timeoutInterval: 30.0]; + + if (postData != nullptr && postData->getSize() > 0) + { + [r setHTTPMethod: nsStringLiteral ("POST")]; + [r setHTTPBody: [NSData dataWithBytes: postData->getData() + length: postData->getSize()]]; + } + + if (headers != nullptr) + { + for (int i = 0; i < headers->size(); ++i) + { + const String headerName ((*headers)[i].upToFirstOccurrenceOf (":", false, false).trim()); + const String headerValue ((*headers)[i].fromFirstOccurrenceOf (":", false, false).trim()); + + [r setValue: juceStringToNS (headerValue) + forHTTPHeaderField: juceStringToNS (headerName)]; + } + } + + #if JUCE_MAC + [[webView mainFrame] loadRequest: r]; + #else + [webView loadRequest: r]; + #endif + } } void goBack() { [webView goBack]; } @@ -392,3 +400,7 @@ void WebBrowserComponent::visibilityChanged() { checkWindowAssociation(); } + +void WebBrowserComponent::focusGained (FocusChangeType) +{ +} diff --git a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp index 2e1979810b..77a6f2e572 100644 --- a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp @@ -53,7 +53,7 @@ public: if (connectionPoint != nullptr) { - WebBrowserComponent* const owner = dynamic_cast (getParentComponent()); + WebBrowserComponent* const owner = dynamic_cast (getParentComponent()); jassert (owner != nullptr); EventHandler* handler = new EventHandler (*owner); @@ -129,13 +129,11 @@ private: DWORD adviseCookie; //============================================================================== - class EventHandler : public ComBaseClassHelper , + class EventHandler : public ComBaseClassHelper, public ComponentMovementWatcher { public: - EventHandler (WebBrowserComponent& owner_) - : ComponentMovementWatcher (&owner_), - owner (owner_) + EventHandler (WebBrowserComponent& w) : ComponentMovementWatcher (&w), owner (w) { } @@ -330,3 +328,26 @@ void WebBrowserComponent::visibilityChanged() { checkWindowAssociation(); } + +void WebBrowserComponent::focusGained (FocusChangeType) +{ + if (IOleObject* oleObject = (IOleObject*) browser->queryInterface (&IID_IOleObject)) + { + if (IOleWindow* oleWindow = (IOleWindow*) browser->queryInterface (&IID_IOleWindow)) + { + IOleClientSite* oleClientSite = nullptr; + + if (SUCCEEDED (oleObject->GetClientSite (&oleClientSite))) + { + HWND hwnd; + oleWindow->GetWindow (&hwnd); + oleObject->DoVerb (OLEIVERB_UIACTIVATE, nullptr, oleClientSite, 0, hwnd, nullptr); + oleClientSite->Release(); + } + + oleWindow->Release(); + } + + oleObject->Release(); + } +}