<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[188602] trunk/Source/WebKit2</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/188602">188602</a></dd>
<dt>Author</dt> <dd>andersca@apple.com</dd>
<dt>Date</dt> <dd>2015-08-18 15:18:47 -0700 (Tue, 18 Aug 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>REGRESSION: Playing audio causes near-instant crash
https://bugs.webkit.org/show_bug.cgi?id=148059
rdar://problem/22282680
Reviewed by Sam Weinig.
The version of WebKit that Safari 6.2.8, 7.1.8 and 8.0.8 built against
had an ABI incompatible WKPageUIClientV4 struct. Thankfully we're not going to ship any
versions of Safari that use the "normal" WKPageUIClientV4 struct so just assume that it's always the
broken one and fix it up by converting it to a WKPageUIClientV5 struct and setting that as the page UI client.
* UIProcess/API/C/WKPage.cpp:
(fixUpBotchedPageUIClient):
(WKPageSetPageUIClient):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKPagecpp">trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (188601 => 188602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-08-18 22:11:40 UTC (rev 188601)
+++ trunk/Source/WebKit2/ChangeLog        2015-08-18 22:18:47 UTC (rev 188602)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2015-08-18 Anders Carlsson <andersca@apple.com>
+
+ REGRESSION: Playing audio causes near-instant crash
+ https://bugs.webkit.org/show_bug.cgi?id=148059
+ rdar://problem/22282680
+
+ Reviewed by Sam Weinig.
+
+ The version of WebKit that Safari 6.2.8, 7.1.8 and 8.0.8 built against
+ had an ABI incompatible WKPageUIClientV4 struct. Thankfully we're not going to ship any
+ versions of Safari that use the "normal" WKPageUIClientV4 struct so just assume that it's always the
+ broken one and fix it up by converting it to a WKPageUIClientV5 struct and setting that as the page UI client.
+
+ * UIProcess/API/C/WKPage.cpp:
+ (fixUpBotchedPageUIClient):
+ (WKPageSetPageUIClient):
+
</ins><span class="cx"> 2015-08-17 Filip Pizlo <fpizlo@apple.com>
</span><span class="cx">
</span><span class="cx"> Replace all remaining uses of WTF::Mutex with WTF::Lock
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (188601 => 188602)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp        2015-08-18 22:11:40 UTC (rev 188601)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp        2015-08-18 22:18:47 UTC (rev 188602)
</span><span class="lines">@@ -1332,8 +1332,147 @@
</span><span class="cx"> toImpl(pageRef)->setPolicyClient(std::make_unique<PolicyClient>(wkClient));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+static void fixUpBotchedPageUIClient(WKPageRef pageRef, const WKPageUIClientBase& wkClient)
+{
+ struct BotchedWKPageUIClientV4 {
+ WKPageUIClientBase base;
+
+ // Version 0.
+ WKPageCreateNewPageCallback_deprecatedForUseWithV0 createNewPage_deprecatedForUseWithV0;
+ WKPageUIClientCallback showPage;
+ WKPageUIClientCallback close;
+ WKPageTakeFocusCallback takeFocus;
+ WKPageFocusCallback focus;
+ WKPageUnfocusCallback unfocus;
+ WKPageRunJavaScriptAlertCallback_deprecatedForUseWithV0 runJavaScriptAlert_deprecatedForUseWithV0;
+ WKPageRunJavaScriptConfirmCallback_deprecatedForUseWithV0 runJavaScriptConfirm_deprecatedForUseWithV0;
+ WKPageRunJavaScriptPromptCallback_deprecatedForUseWithV0 runJavaScriptPrompt_deprecatedForUseWithV0;
+ WKPageSetStatusTextCallback setStatusText;
+ WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0 mouseDidMoveOverElement_deprecatedForUseWithV0;
+ WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0 missingPluginButtonClicked_deprecatedForUseWithV0;
+ WKPageDidNotHandleKeyEventCallback didNotHandleKeyEvent;
+ WKPageDidNotHandleWheelEventCallback didNotHandleWheelEvent;
+ WKPageGetToolbarsAreVisibleCallback toolbarsAreVisible;
+ WKPageSetToolbarsAreVisibleCallback setToolbarsAreVisible;
+ WKPageGetMenuBarIsVisibleCallback menuBarIsVisible;
+ WKPageSetMenuBarIsVisibleCallback setMenuBarIsVisible;
+ WKPageGetStatusBarIsVisibleCallback statusBarIsVisible;
+ WKPageSetStatusBarIsVisibleCallback setStatusBarIsVisible;
+ WKPageGetIsResizableCallback isResizable;
+ WKPageSetIsResizableCallback setIsResizable;
+ WKPageGetWindowFrameCallback getWindowFrame;
+ WKPageSetWindowFrameCallback setWindowFrame;
+ WKPageRunBeforeUnloadConfirmPanelCallback runBeforeUnloadConfirmPanel;
+ WKPageUIClientCallback didDraw;
+ WKPageUIClientCallback pageDidScroll;
+ WKPageExceededDatabaseQuotaCallback exceededDatabaseQuota;
+ WKPageRunOpenPanelCallback runOpenPanel;
+ WKPageDecidePolicyForGeolocationPermissionRequestCallback decidePolicyForGeolocationPermissionRequest;
+ WKPageHeaderHeightCallback headerHeight;
+ WKPageFooterHeightCallback footerHeight;
+ WKPageDrawHeaderCallback drawHeader;
+ WKPageDrawFooterCallback drawFooter;
+ WKPagePrintFrameCallback printFrame;
+ WKPageUIClientCallback runModal;
+ void* unused1; // Used to be didCompleteRubberBandForMainFrame
+ WKPageSaveDataToFileInDownloadsFolderCallback saveDataToFileInDownloadsFolder;
+ void* shouldInterruptJavaScript_unavailable;
+
+ // Version 1.
+ WKPageCreateNewPageCallback_deprecatedForUseWithV1 createNewPage;
+ WKPageMouseDidMoveOverElementCallback mouseDidMoveOverElement;
+ WKPageDecidePolicyForNotificationPermissionRequestCallback decidePolicyForNotificationPermissionRequest;
+ WKPageUnavailablePluginButtonClickedCallback_deprecatedForUseWithV1 unavailablePluginButtonClicked_deprecatedForUseWithV1;
+
+ // Version 2.
+ WKPageShowColorPickerCallback showColorPicker;
+ WKPageHideColorPickerCallback hideColorPicker;
+ WKPageUnavailablePluginButtonClickedCallback unavailablePluginButtonClicked;
+
+ // Version 3.
+ WKPagePinnedStateDidChangeCallback pinnedStateDidChange;
+
+ // Version 4.
+ WKPageRunJavaScriptAlertCallback runJavaScriptAlert;
+ WKPageRunJavaScriptConfirmCallback runJavaScriptConfirm;
+ WKPageRunJavaScriptPromptCallback runJavaScriptPrompt;
+ };
+
+ const auto& botchedPageUIClient = reinterpret_cast<const BotchedWKPageUIClientV4&>(wkClient);
+
+ WKPageUIClientV5 fixedPageUIClient = {
+ { 5, botchedPageUIClient.base.clientInfo },
+ botchedPageUIClient.createNewPage_deprecatedForUseWithV0,
+ botchedPageUIClient.showPage,
+ botchedPageUIClient.close,
+ botchedPageUIClient.takeFocus,
+ botchedPageUIClient.focus,
+ botchedPageUIClient.unfocus,
+ botchedPageUIClient.runJavaScriptAlert_deprecatedForUseWithV0,
+ botchedPageUIClient.runJavaScriptConfirm_deprecatedForUseWithV0,
+ botchedPageUIClient.runJavaScriptPrompt_deprecatedForUseWithV0,
+ botchedPageUIClient.setStatusText,
+ botchedPageUIClient.mouseDidMoveOverElement_deprecatedForUseWithV0,
+ botchedPageUIClient.missingPluginButtonClicked_deprecatedForUseWithV0,
+ botchedPageUIClient.didNotHandleKeyEvent,
+ botchedPageUIClient.didNotHandleWheelEvent,
+ botchedPageUIClient.toolbarsAreVisible,
+ botchedPageUIClient.setToolbarsAreVisible,
+ botchedPageUIClient.menuBarIsVisible,
+ botchedPageUIClient.setMenuBarIsVisible,
+ botchedPageUIClient.statusBarIsVisible,
+ botchedPageUIClient.setStatusBarIsVisible,
+ botchedPageUIClient.isResizable,
+ botchedPageUIClient.setIsResizable,
+ botchedPageUIClient.getWindowFrame,
+ botchedPageUIClient.setWindowFrame,
+ botchedPageUIClient.runBeforeUnloadConfirmPanel,
+ botchedPageUIClient.didDraw,
+ botchedPageUIClient.pageDidScroll,
+ botchedPageUIClient.exceededDatabaseQuota,
+ botchedPageUIClient.runOpenPanel,
+ botchedPageUIClient.decidePolicyForGeolocationPermissionRequest,
+ botchedPageUIClient.headerHeight,
+ botchedPageUIClient.footerHeight,
+ botchedPageUIClient.drawHeader,
+ botchedPageUIClient.drawFooter,
+ botchedPageUIClient.printFrame,
+ botchedPageUIClient.runModal,
+ botchedPageUIClient.unused1,
+ botchedPageUIClient.saveDataToFileInDownloadsFolder,
+ botchedPageUIClient.shouldInterruptJavaScript_unavailable,
+ botchedPageUIClient.createNewPage,
+ botchedPageUIClient.mouseDidMoveOverElement,
+ botchedPageUIClient.decidePolicyForNotificationPermissionRequest,
+ botchedPageUIClient.unavailablePluginButtonClicked_deprecatedForUseWithV1,
+ botchedPageUIClient.showColorPicker,
+ botchedPageUIClient.hideColorPicker,
+ botchedPageUIClient.unavailablePluginButtonClicked,
+ botchedPageUIClient.pinnedStateDidChange,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ botchedPageUIClient.runJavaScriptAlert,
+ botchedPageUIClient.runJavaScriptConfirm,
+ botchedPageUIClient.runJavaScriptPrompt,
+ nullptr,
+ };
+
+ WKPageSetPageUIClient(pageRef, &fixedPageUIClient.base);
+}
+
</ins><span class="cx"> void WKPageSetPageUIClient(WKPageRef pageRef, const WKPageUIClientBase* wkClient)
</span><span class="cx"> {
</span><ins>+#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED <= 101100
+ if (wkClient && wkClient->version == 4) {
+ fixUpBotchedPageUIClient(pageRef, *wkClient);
+ return;
+ }
+#endif
+
</ins><span class="cx"> class UIClient : public API::Client<WKPageUIClientBase>, public API::UIClient {
</span><span class="cx"> public:
</span><span class="cx"> explicit UIClient(const WKPageUIClientBase* client)
</span></span></pre>
</div>
</div>
</body>
</html>