<!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>[201457] trunk</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/201457">201457</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-05-27 11:50:24 -0700 (Fri, 27 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Expose content extension failure error codes in SPI
https://bugs.webkit.org/show_bug.cgi?id=158095
rdar://problem/26475651

Reviewed by Anders Carlsson.

Source/WebKit2:

* UIProcess/API/APIUserContentExtensionStore.cpp:
(API::UserContentExtensionStore::synchronousRemoveAllContentExtensions):
(API::UserContentExtensionStore::invalidateContentExtensionVersion):
Added for testing.
(API::userContentExtensionStoreErrorCategory):
* UIProcess/API/APIUserContentExtensionStore.h:
* UIProcess/API/Cocoa/_WKUserContentExtensionStore.h:
Added the new enum, _WKUserContentExtensionStoreErrorCode.
* UIProcess/API/Cocoa/_WKUserContentExtensionStore.mm:
(-[_WKUserContentExtensionStore compileContentExtensionForIdentifier:encodedContentExtension:completionHandler:]):
Sometimes the error code returned by UserContentExtensionStore::compileContentExtension has the error code from compileRuleList.
When this happens, we want to get the message from the internal compiler error, but we want the NSError's code to always be CompileFailed.
(-[_WKUserContentExtensionStore lookupContentExtensionForIdentifier:completionHandler:]):
(-[_WKUserContentExtensionStore removeContentExtensionForIdentifier:completionHandler:]):
(-[_WKUserContentExtensionStore _removeAllContentExtensions]):
(-[_WKUserContentExtensionStore _invalidateContentExtensionVersionForIdentifier:]):
* UIProcess/API/Cocoa/_WKUserContentExtensionStorePrivate.h:
Added new invalidator for testing.

Tools:

* TestWebKitAPI/Tests/WebKit2Cocoa/_WKUserContentExtensionStore.mm:
(checkDomain):
(TEST_F):
Add tests that use the new enum.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIAPIUserContentExtensionStorecpp">trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIAPIUserContentExtensionStoreh">trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKUserContentExtensionStoreh">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStore.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKUserContentExtensionStoremm">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStore.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKUserContentExtensionStorePrivateh">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStorePrivate.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2Cocoa_WKUserContentExtensionStoremm">trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/_WKUserContentExtensionStore.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (201456 => 201457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-05-27 18:36:30 UTC (rev 201456)
+++ trunk/Source/WebKit2/ChangeLog        2016-05-27 18:50:24 UTC (rev 201457)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2016-05-27  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Expose content extension failure error codes in SPI
+        https://bugs.webkit.org/show_bug.cgi?id=158095
+        rdar://problem/26475651
+
+        Reviewed by Anders Carlsson.
+
+        * UIProcess/API/APIUserContentExtensionStore.cpp:
+        (API::UserContentExtensionStore::synchronousRemoveAllContentExtensions):
+        (API::UserContentExtensionStore::invalidateContentExtensionVersion):
+        Added for testing.
+        (API::userContentExtensionStoreErrorCategory):
+        * UIProcess/API/APIUserContentExtensionStore.h:
+        * UIProcess/API/Cocoa/_WKUserContentExtensionStore.h:
+        Added the new enum, _WKUserContentExtensionStoreErrorCode.
+        * UIProcess/API/Cocoa/_WKUserContentExtensionStore.mm:
+        (-[_WKUserContentExtensionStore compileContentExtensionForIdentifier:encodedContentExtension:completionHandler:]):
+        Sometimes the error code returned by UserContentExtensionStore::compileContentExtension has the error code from compileRuleList.
+        When this happens, we want to get the message from the internal compiler error, but we want the NSError's code to always be CompileFailed.
+        (-[_WKUserContentExtensionStore lookupContentExtensionForIdentifier:completionHandler:]):
+        (-[_WKUserContentExtensionStore removeContentExtensionForIdentifier:completionHandler:]):
+        (-[_WKUserContentExtensionStore _removeAllContentExtensions]):
+        (-[_WKUserContentExtensionStore _invalidateContentExtensionVersionForIdentifier:]):
+        * UIProcess/API/Cocoa/_WKUserContentExtensionStorePrivate.h:
+        Added new invalidator for testing.
+
</ins><span class="cx"> 2016-05-27  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Regression(r200972): Webcore::Range::collectSelectionsRects() asserts in startContainer() while selecting text.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIUserContentExtensionStorecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.cpp (201456 => 201457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.cpp        2016-05-27 18:36:30 UTC (rev 201456)
+++ trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.cpp        2016-05-27 18:50:24 UTC (rev 201457)
</span><span class="lines">@@ -391,6 +391,17 @@
</span><span class="cx">         WebCore::deleteFile(path);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UserContentExtensionStore::invalidateContentExtensionVersion(const WTF::String&amp; identifier)
+{
+    auto file = WebCore::openFile(constructedPath(m_storePath, identifier), WebCore::OpenForWrite);
+    if (file == WebCore::invalidPlatformFileHandle)
+        return;
+    ContentExtensionMetaData invalidHeader = {0, 0, 0, 0, 0};
+    auto bytesWritten = WebCore::writeToFile(file, reinterpret_cast&lt;const char*&gt;(&amp;invalidHeader), sizeof(invalidHeader));
+    ASSERT_UNUSED(bytesWritten, bytesWritten == sizeof(invalidHeader));
+    WebCore::closeFile(file);
+}
+    
</ins><span class="cx"> const std::error_category&amp; userContentExtensionStoreErrorCategory()
</span><span class="cx"> {
</span><span class="cx">     class UserContentExtensionStoreErrorCategory : public std::error_category {
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIUserContentExtensionStoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.h (201456 => 201457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.h        2016-05-27 18:36:30 UTC (rev 201456)
+++ trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.h        2016-05-27 18:50:24 UTC (rev 201457)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx"> 
</span><span class="cx">     // For testing only.
</span><span class="cx">     void synchronousRemoveAllContentExtensions();
</span><ins>+    void invalidateContentExtensionVersion(const WTF::String&amp; identifier);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     WTF::String defaultStorePath();
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKUserContentExtensionStoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStore.h (201456 => 201457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStore.h        2016-05-27 18:36:30 UTC (rev 201456)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStore.h        2016-05-27 18:50:24 UTC (rev 201457)
</span><span class="lines">@@ -41,4 +41,13 @@
</span><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span><ins>+WK_EXTERN NSString * const _WKUserContentExtensionsDomain WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+
+typedef NS_ENUM(NSInteger, _WKUserContentExtensionStoreErrorCode) {
+    _WKUserContentExtensionStoreErrorLookupFailed = 1,
+    _WKUserContentExtensionStoreErrorVersionMismatch,
+    _WKUserContentExtensionStoreErrorCompileFailed,
+    _WKUserContentExtensionStoreErrorRemoveFailed,
+} WK_ENUM_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+
</ins><span class="cx"> #endif // WK_API_ENABLED
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKUserContentExtensionStoremm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStore.mm (201456 => 201457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStore.mm        2016-05-27 18:36:30 UTC (rev 201456)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStore.mm        2016-05-27 18:50:24 UTC (rev 201457)
</span><span class="lines">@@ -32,6 +32,8 @@
</span><span class="cx"> #import &quot;_WKUserContentFilterInternal.h&quot;
</span><span class="cx"> #import &lt;string&gt;
</span><span class="cx"> 
</span><ins>+NSString * const _WKUserContentExtensionsDomain = @&quot;_WKUserContentExtensionsDomain&quot;;
+
</ins><span class="cx"> @implementation _WKUserContentExtensionStore
</span><span class="cx"> 
</span><span class="cx"> - (void)dealloc
</span><span class="lines">@@ -65,7 +67,10 @@
</span><span class="cx">             auto rawHandler = (void (^)(_WKUserContentFilter *, NSError *))handler.get();
</span><span class="cx">             
</span><span class="cx">             auto userInfo = @{NSHelpAnchorErrorKey: [NSString stringWithFormat:@&quot;Extension compilation failed: %s&quot;, error.message().c_str()]};
</span><del>-            rawHandler(nil, [NSError errorWithDomain:@&quot;ContentExtensionsDomain&quot; code:error.value() userInfo:userInfo]);
</del><ins>+
+            // error.value() could have a specific compiler error that is not equal to _WKUserContentExtensionStoreErrorCompileFailed.
+            // We want to use error.message, but here we want to only pass on CompileFailed.
+            rawHandler(nil, [NSError errorWithDomain:_WKUserContentExtensionsDomain code:_WKUserContentExtensionStoreErrorCompileFailed userInfo:userInfo]);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -83,7 +88,8 @@
</span><span class="cx">             auto rawHandler = (void (^)(_WKUserContentFilter *, NSError *))handler.get();
</span><span class="cx"> 
</span><span class="cx">             auto userInfo = @{NSHelpAnchorErrorKey: [NSString stringWithFormat:@&quot;Extension lookup failed: %s&quot;, error.message().c_str()]};
</span><del>-            rawHandler(nil, [NSError errorWithDomain:@&quot;ContentExtensionsDomain&quot; code:error.value() userInfo:userInfo]);
</del><ins>+            ASSERT(error.value() == _WKUserContentExtensionStoreErrorLookupFailed || error.value() == _WKUserContentExtensionStoreErrorVersionMismatch);
+            rawHandler(nil, [NSError errorWithDomain:_WKUserContentExtensionsDomain code:error.value() userInfo:userInfo]);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -101,7 +107,8 @@
</span><span class="cx">             auto rawHandler = (void (^)(NSError *))handler.get();
</span><span class="cx"> 
</span><span class="cx">             auto userInfo = @{NSHelpAnchorErrorKey: [NSString stringWithFormat:@&quot;Extension removal failed: %s&quot;, error.message().c_str()]};
</span><del>-            rawHandler([NSError errorWithDomain:@&quot;ContentExtensionsDomain&quot; code:error.value() userInfo:userInfo]);
</del><ins>+            ASSERT(error.value() == _WKUserContentExtensionStoreErrorRemoveFailed);
+            rawHandler([NSError errorWithDomain:_WKUserContentExtensionsDomain code:_WKUserContentExtensionStoreErrorRemoveFailed userInfo:userInfo]);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -128,6 +135,11 @@
</span><span class="cx">     _userContentExtensionStore-&gt;synchronousRemoveAllContentExtensions();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_invalidateContentExtensionVersionForIdentifier:(NSString *)identifier
+{
+    _userContentExtensionStore-&gt;invalidateContentExtensionVersion(identifier);
+}
+
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> #endif // WK_API_ENABLED
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKUserContentExtensionStorePrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStorePrivate.h (201456 => 201457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStorePrivate.h        2016-05-27 18:36:30 UTC (rev 201456)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentExtensionStorePrivate.h        2016-05-27 18:50:24 UTC (rev 201457)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> // For testing only.
</span><span class="cx"> - (void)_removeAllContentExtensions;
</span><ins>+- (void)_invalidateContentExtensionVersionForIdentifier:(NSString *)identifier;
</ins><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (201456 => 201457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-05-27 18:36:30 UTC (rev 201456)
+++ trunk/Tools/ChangeLog        2016-05-27 18:50:24 UTC (rev 201457)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2016-05-26  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Expose content extension failure error codes in SPI
+        https://bugs.webkit.org/show_bug.cgi?id=158095
+        rdar://problem/26475651
+
+        Reviewed by Anders Carlsson.
+
+        * TestWebKitAPI/Tests/WebKit2Cocoa/_WKUserContentExtensionStore.mm:
+        (checkDomain):
+        (TEST_F):
+        Add tests that use the new enum.
+
</ins><span class="cx"> 2016-05-27  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         New intl-numberformat.js test fails on many Linux platforms
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2Cocoa_WKUserContentExtensionStoremm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/_WKUserContentExtensionStore.mm (201456 => 201457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/_WKUserContentExtensionStore.mm        2016-05-27 18:36:30 UTC (rev 201456)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/_WKUserContentExtensionStore.mm        2016-05-27 18:50:24 UTC (rev 201457)
</span><span class="lines">@@ -58,6 +58,11 @@
</span><span class="cx"> 
</span><span class="cx"> static NSString *invalidFilter = @&quot;[&quot;;
</span><span class="cx"> 
</span><ins>+static void checkDomain(NSError *error)
+{
+    EXPECT_STREQ([[error domain] UTF8String], [_WKUserContentExtensionsDomain UTF8String]);
+}
+
</ins><span class="cx"> TEST_F(_WKUserContentExtensionStoreTest, InvalidExtension)
</span><span class="cx"> {
</span><span class="cx">     __block bool doneCompiling = false;
</span><span class="lines">@@ -65,6 +70,8 @@
</span><span class="cx">     
</span><span class="cx">         EXPECT_NULL(filter);
</span><span class="cx">         EXPECT_NOT_NULL(error);
</span><ins>+        checkDomain(error);
+        EXPECT_EQ(error.code, _WKUserContentExtensionStoreErrorCompileFailed);
</ins><span class="cx">         EXPECT_STREQ(&quot;Extension compilation failed: Failed to parse the JSON String.&quot;, [[error helpAnchor] UTF8String]);
</span><span class="cx"> 
</span><span class="cx">         doneCompiling = true;
</span><span class="lines">@@ -102,8 +109,40 @@
</span><span class="cx">     
</span><span class="cx">         EXPECT_NULL(filter);
</span><span class="cx">         EXPECT_NOT_NULL(error);
</span><ins>+        checkDomain(error);
+        EXPECT_EQ(error.code, _WKUserContentExtensionStoreErrorLookupFailed);
</ins><span class="cx">         EXPECT_STREQ(&quot;Extension lookup failed: Unspecified error during lookup.&quot;, [[error helpAnchor] UTF8String]);
</span><ins>+        
+        doneLookingUp = true;
+    }];
+    TestWebKitAPI::Util::run(&amp;doneLookingUp);
+}
</ins><span class="cx"> 
</span><ins>+TEST_F(_WKUserContentExtensionStoreTest, VersionMismatch)
+{
+    __block bool doneCompiling = false;
+    [[_WKUserContentExtensionStore defaultStore] compileContentExtensionForIdentifier:@&quot;TestExtension&quot; encodedContentExtension:basicFilter completionHandler:^(_WKUserContentFilter *filter, NSError *error)
+    {
+        
+        EXPECT_NOT_NULL(filter);
+        EXPECT_NULL(error);
+        
+        doneCompiling = true;
+    }];
+    TestWebKitAPI::Util::run(&amp;doneCompiling);
+
+    [[_WKUserContentExtensionStore defaultStore] _invalidateContentExtensionVersionForIdentifier:@&quot;TestExtension&quot;];
+    
+    __block bool doneLookingUp = false;
+    [[_WKUserContentExtensionStore defaultStore] lookupContentExtensionForIdentifier:@&quot;TestExtension&quot; completionHandler:^(_WKUserContentFilter *filter, NSError *error)
+    {
+        
+        EXPECT_NULL(filter);
+        EXPECT_NOT_NULL(error);
+        checkDomain(error);
+        EXPECT_EQ(error.code, _WKUserContentExtensionStoreErrorVersionMismatch);
+        EXPECT_STREQ(&quot;Extension lookup failed: Version of file does not match version of interpreter.&quot;, [[error helpAnchor] UTF8String]);
+        
</ins><span class="cx">         doneLookingUp = true;
</span><span class="cx">     }];
</span><span class="cx">     TestWebKitAPI::Util::run(&amp;doneLookingUp);
</span><span class="lines">@@ -135,6 +174,8 @@
</span><span class="cx">     __block bool doneRemoving = false;
</span><span class="cx">     [[_WKUserContentExtensionStore defaultStore] removeContentExtensionForIdentifier:@&quot;DoesNotExist&quot; completionHandler:^(NSError *error) {
</span><span class="cx">         EXPECT_NOT_NULL(error);
</span><ins>+        checkDomain(error);
+        EXPECT_EQ(error.code, _WKUserContentExtensionStoreErrorRemoveFailed);
</ins><span class="cx">         EXPECT_STREQ(&quot;Extension removal failed: Unspecified error during remove.&quot;, [[error helpAnchor] UTF8String]);
</span><span class="cx"> 
</span><span class="cx">         doneRemoving = true;
</span></span></pre>
</div>
</div>

</body>
</html>