Changeset 166733 in webkit
- Timestamp:
- Apr 3, 2014 11:34:18 AM (10 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r166731 r166733 1 2014-04-03 Anders Carlsson <andersca@apple.com> 2 3 WKWebView should always have a UIDelegate, even when closed 4 https://bugs.webkit.org/show_bug.cgi?id=131174 5 <rdar://problem/16389248> 6 7 Reviewed by Sam Weinig. 8 9 * UIProcess/API/Cocoa/WKWebView.mm: 10 (-[WKWebView initWithFrame:configuration:]): 11 (-[WKWebView UIDelegate]): 12 (-[WKWebView setUIDelegate:]): 13 * UIProcess/Cocoa/UIDelegate.h: 14 * UIProcess/Cocoa/UIDelegate.mm: 15 (WebKit::UIDelegate::UIDelegate): 16 (WebKit::UIDelegate::~UIDelegate): 17 (WebKit::UIDelegate::createUIClient): 18 (WebKit::UIDelegate::delegate): 19 (WebKit::UIDelegate::setDelegate): 20 (WebKit::UIDelegate::UIClient::UIClient): 21 (WebKit::UIDelegate::UIClient::~UIClient): 22 (WebKit::UIDelegate::UIClient::createNewPage): 23 (WebKit::UIDelegate::UIClient::runJavaScriptAlert): 24 (WebKit::UIDelegate::UIClient::runJavaScriptConfirm): 25 (WebKit::UIDelegate::UIClient::runJavaScriptPrompt): 26 (WebKit::UIDelegate::UIClient::actionsForElement): 27 (WebKit::UIClient::UIClient): Deleted. 28 (WebKit::UIClient::~UIClient): Deleted. 29 (WebKit::UIClient::delegate): Deleted. 30 (WebKit::UIClient::setDelegate): Deleted. 31 (WebKit::UIClient::createNewPage): Deleted. 32 (WebKit::UIClient::runJavaScriptAlert): Deleted. 33 (WebKit::UIClient::runJavaScriptConfirm): Deleted. 34 (WebKit::UIClient::runJavaScriptPrompt): Deleted. 35 (WebKit::UIClient::actionsForElement): Deleted. 36 * UIProcess/ios/WKActionSheetAssistant.mm: 37 1 38 2014-04-02 Anders Carlsson <andersca@apple.com> 2 39 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm
r166720 r166733 83 83 @implementation WKWebView { 84 84 std::unique_ptr<WebKit::NavigationState> _navigationState; 85 std::unique_ptr<WebKit::UIDelegate> _uiDelegate; 85 86 86 87 RetainPtr<_WKRemoteObjectRegistry> _remoteObjectRegistry; … … 200 201 _page->setPolicyClient(_navigationState->createPolicyClient()); 201 202 _page->setLoaderClient(_navigationState->createLoaderClient()); 202 _page->setUIClient(std::make_unique<WebKit::UIClient>(self)); 203 204 _uiDelegate = std::make_unique<WebKit::UIDelegate>(self); 205 _page->setUIClient(_uiDelegate->createUIClient()); 206 203 207 _page->setFindClient(std::make_unique<WebKit::FindClient>(self)); 208 204 209 return self; 205 210 } … … 238 243 - (id <WKUIDelegate>)UIDelegate 239 244 { 240 // FIXME: A closed page should still have a UI delegate - it should just never be called. 241 if (_page->isClosed()) 242 return nil; 243 244 return [static_cast<WebKit::UIClient&>(_page->uiClient()).delegate().leakRef() autorelease]; 245 return [_uiDelegate->delegate().leakRef() autorelease]; 245 246 } 246 247 247 248 - (void)setUIDelegate:(id<WKUIDelegate>)UIDelegate 248 249 { 249 // FIXME: A closed page should still have a UI delegate - it should just never be called. 250 if (_page->isClosed()) 251 return; 252 253 static_cast<WebKit::UIClient&>(_page->uiClient()).setDelegate(UIDelegate); 250 _uiDelegate->setDelegate(UIDelegate); 254 251 } 255 252 -
trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.h
r166730 r166733 41 41 namespace WebKit { 42 42 43 class UI Client : public API::UIClient{43 class UIDelegate { 44 44 public: 45 explicit UIClient(WKWebView *); 46 ~UIClient(); 45 explicit UIDelegate(WKWebView *); 46 ~UIDelegate(); 47 48 std::unique_ptr<API::UIClient> createUIClient(); 47 49 48 50 RetainPtr<id <WKUIDelegate> > delegate(); … … 50 52 51 53 private: 52 // API::UIClient 53 virtual PassRefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button) override; 54 virtual void runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void ()> completionHandler) override; 55 virtual void runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (bool)> completionHandler) override; 56 virtual void runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (const WTF::String&)> completionHandler) override; 57 #if PLATFORM(IOS) 58 virtual RetainPtr<NSArray> actionsForElement(_WKActivatedElementInfo *, RetainPtr<NSArray> defaultActions) override; 59 #endif 54 class UIClient : public API::UIClient { 55 public: 56 explicit UIClient(UIDelegate&); 57 ~UIClient(); 58 59 private: 60 // API::UIClient 61 virtual PassRefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button) override; 62 virtual void runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void ()> completionHandler) override; 63 virtual void runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (bool)> completionHandler) override; 64 virtual void runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (const WTF::String&)> completionHandler) override; 65 #if PLATFORM(IOS) 66 virtual RetainPtr<NSArray> actionsForElement(_WKActivatedElementInfo *, RetainPtr<NSArray> defaultActions) override; 67 #endif 68 69 UIDelegate& m_uiDelegate; 70 }; 60 71 61 72 WKWebView *m_webView; -
trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.mm
r166730 r166733 38 38 namespace WebKit { 39 39 40 UI Client::UIClient(WKWebView *webView)40 UIDelegate::UIDelegate(WKWebView *webView) 41 41 : m_webView(webView) 42 42 { 43 43 } 44 44 45 UI Client::~UIClient()45 UIDelegate::~UIDelegate() 46 46 { 47 47 } 48 48 49 RetainPtr<id <WKUIDelegate> > UIClient::delegate() 49 std::unique_ptr<API::UIClient> UIDelegate::createUIClient() 50 { 51 return std::make_unique<UIClient>(*this); 52 } 53 54 RetainPtr<id <WKUIDelegate> > UIDelegate::delegate() 50 55 { 51 56 return m_delegate.get(); 52 57 } 53 58 54 void UI Client::setDelegate(id <WKUIDelegate> delegate)59 void UIDelegate::setDelegate(id <WKUIDelegate> delegate) 55 60 { 56 61 m_delegate = delegate; … … 65 70 } 66 71 67 PassRefPtr<WebKit::WebPageProxy> UIClient::createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy* initiatingFrame, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button) 72 UIDelegate::UIClient::UIClient(UIDelegate& uiDelegate) 73 : m_uiDelegate(uiDelegate) 68 74 { 69 if (!m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures) 75 } 76 77 UIDelegate::UIClient::~UIClient() 78 { 79 } 80 81 PassRefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy* initiatingFrame, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button) 82 { 83 if (!m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures) 70 84 return nullptr; 71 85 72 auto delegate = m_ delegate.get();86 auto delegate = m_uiDelegate.m_delegate.get(); 73 87 if (!delegate) 74 88 return nullptr; 75 89 76 auto configuration = adoptNS([m_ webView->_configuration copy]);77 [configuration _setRelatedWebView:m_ webView];90 auto configuration = adoptNS([m_uiDelegate.m_webView->_configuration copy]); 91 [configuration _setRelatedWebView:m_uiDelegate.m_webView]; 78 92 79 93 auto navigationAction = adoptNS([[WKNavigationAction alloc] init]); … … 84 98 [navigationAction setRequest:request.nsURLRequest(WebCore::DoNotUpdateHTTPBody)]; 85 99 86 RetainPtr<WKWebView> webView = [delegate.get() webView:m_ webView createWebViewWithConfiguration:configuration.get() forNavigationAction:navigationAction.get() windowFeatures:adoptNS([[WKWindowFeatures alloc] _initWithWindowFeatures:windowFeatures]).get()];100 RetainPtr<WKWebView> webView = [delegate.get() webView:m_uiDelegate.m_webView createWebViewWithConfiguration:configuration.get() forNavigationAction:navigationAction.get() windowFeatures:adoptNS([[WKWindowFeatures alloc] _initWithWindowFeatures:windowFeatures]).get()]; 87 101 88 102 if (!webView) 89 103 return nullptr; 90 104 91 if ([webView->_configuration _relatedWebView] != m_ webView)105 if ([webView->_configuration _relatedWebView] != m_uiDelegate.m_webView) 92 106 [NSException raise:NSInternalInconsistencyException format:@"Returned WKWebView was not created with the given configuration."]; 93 107 … … 95 109 } 96 110 97 void UI Client::runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void ()> completionHandler)111 void UIDelegate::UIClient::runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void ()> completionHandler) 98 112 { 99 if (!m_ delegateMethods.webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler) {113 if (!m_uiDelegate.m_delegateMethods.webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler) { 100 114 completionHandler(); 101 115 return; 102 116 } 103 117 104 auto delegate = m_ delegate.get();118 auto delegate = m_uiDelegate.m_delegate.get(); 105 119 if (!delegate) { 106 120 completionHandler(); … … 108 122 } 109 123 110 [delegate webView:m_ webView runJavaScriptAlertPanelWithMessage:message initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler] {124 [delegate webView:m_uiDelegate.m_webView runJavaScriptAlertPanelWithMessage:message initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler] { 111 125 completionHandler(); 112 126 }]; 113 127 } 114 128 115 void UI Client::runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void (bool)> completionHandler)129 void UIDelegate::UIClient::runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void (bool)> completionHandler) 116 130 { 117 if (!m_ delegateMethods.webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler) {131 if (!m_uiDelegate.m_delegateMethods.webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler) { 118 132 completionHandler(false); 119 133 return; 120 134 } 121 135 122 auto delegate = m_ delegate.get();136 auto delegate = m_uiDelegate.m_delegate.get(); 123 137 if (!delegate) { 124 138 completionHandler(false); … … 126 140 } 127 141 128 [delegate webView:m_ webView runJavaScriptConfirmPanelWithMessage:message initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler](BOOL result) {142 [delegate webView:m_uiDelegate.m_webView runJavaScriptConfirmPanelWithMessage:message initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler](BOOL result) { 129 143 completionHandler(result); 130 144 }]; 131 145 } 132 146 133 void UI Client::runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String& message, const WTF::String& defaultValue, WebKit::WebFrameProxy* webFrameProxy, std::function<void (const WTF::String&)> completionHandler)147 void UIDelegate::UIClient::runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String& message, const WTF::String& defaultValue, WebKit::WebFrameProxy* webFrameProxy, std::function<void (const WTF::String&)> completionHandler) 134 148 { 135 if (!m_ delegateMethods.webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler) {149 if (!m_uiDelegate.m_delegateMethods.webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler) { 136 150 completionHandler(String()); 137 151 return; 138 152 } 139 153 140 auto delegate = m_ delegate.get();154 auto delegate = m_uiDelegate.m_delegate.get(); 141 155 if (!delegate) { 142 156 completionHandler(String()); … … 144 158 } 145 159 146 [delegate webView:m_ webView runJavaScriptTextInputPanelWithPrompt:message defaultText:defaultValue initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler](NSString *result) {160 [delegate webView:m_uiDelegate.m_webView runJavaScriptTextInputPanelWithPrompt:message defaultText:defaultValue initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler](NSString *result) { 147 161 completionHandler(result); 148 162 }]; … … 150 164 151 165 #if PLATFORM(IOS) 152 RetainPtr<NSArray> UI Client::actionsForElement(_WKActivatedElementInfo *elementInfo, RetainPtr<NSArray> defaultActions)166 RetainPtr<NSArray> UIDelegate::UIClient::actionsForElement(_WKActivatedElementInfo *elementInfo, RetainPtr<NSArray> defaultActions) 153 167 { 154 if (!m_ delegateMethods.webViewActionsForElementDefaultActions)168 if (!m_uiDelegate.m_delegateMethods.webViewActionsForElementDefaultActions) 155 169 return std::move(defaultActions); 156 170 157 auto delegate = m_ delegate.get();171 auto delegate = m_uiDelegate.m_delegate.get(); 158 172 if (!delegate) 159 173 return defaultActions; 160 174 161 return [(id <WKUIDelegatePrivate>)delegate _webView:m_ webView actionsForElement:elementInfo defaultActions:defaultActions.get()];175 return [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView actionsForElement:elementInfo defaultActions:defaultActions.get()]; 162 176 } 163 177 #endif -
trunk/Source/WebKit2/UIProcess/ios/WKActionSheetAssistant.mm
r166730 r166733 29 29 #if PLATFORM(IOS) 30 30 31 #import "_WKActivatedElementInfoInternal.h" 32 #import "_WKElementActionInternal.h" 33 #import "UIDelegate.h" 31 #import "APIUIClient.h" 34 32 #import "WKActionSheet.h" 35 33 #import "WKContentViewInteraction.h" 36 34 #import "WebPageProxy.h" 37 #import <TCC/TCC.h> 35 #import "_WKActivatedElementInfoInternal.h" 36 #import "_WKElementActionInternal.h" 38 37 #import <DataDetectorsUI/DDDetectionController.h> 39 38 #import <SafariServices/SSReadingList.h> 39 #import <TCC/TCC.h> 40 40 #import <UIKit/UIActionSheet_Private.h> 41 41 #import <UIKit/UIView.h>
Note: See TracChangeset
for help on using the changeset viewer.