Changeset 215573 in webkit


Ignore:
Timestamp:
Apr 20, 2017 12:59:46 PM (7 years ago)
Author:
Wenson Hsieh
Message:

[WK2] -[WKContentView doAfterPositionInformationUpdate:atPosition:] should be robust against synchronous reentrancy
https://bugs.webkit.org/show_bug.cgi?id=170922
<rdar://problem/31634990>

Reviewed by Tim Horton.

Source/WebKit2:

Refactors part of the asynchronous position information mechanism introduced in
<https://trac.webkit.org/changeset/215171>, and introduces infrastructure for unit testing UI-side position
information requests.

_invokeAndRemovePendingHandlersValidForCurrentPositionInformation is a helper method on WKContentView
responsible for invoking queued position information handlers after receiving a position information response
from the web process. Previously, this method would iterate over the list of pending callbacks and invoke all
callbacks whose requests are satisfied by the incoming position information update, saving the indices of these
handled callbacks in the process. At the end, it would then remove callbacks at these indices from the array of
pending callbacks. This is problematic when a synchronous position update (via
ensurePositionInformationIsUpToDate:) is triggered from within one of these callbacks, since
_invokeAndRemovePendingHandlersValidForCurrentPositionInformation will be called from within itself, and then we
will attempt to remove a callback at the same index twice.

To fix this, we change the array of pending position information handlers to be an array of optionals instead.
When invoking and removing pending handlers after a position information response arrives, we now mark callbacks
as handled by setting them to std::nullopt. Then, when the top-level invocation to
_invokeAndRemovePendingHandlersValidForCurrentPositionInformation is finished, we remove all marked handlers
from the pending vector.

Covered by 6 new unit tests:

  • PositionInformationTests.FindDraggableLinkAtPosition
  • PositionInformationTests.RequestDraggableLinkAtPosition
  • PositionInformationTests.FindDraggableLinkAtDifferentPositionWithinRequestBlock
  • PositionInformationTests.FindDraggableLinkAtSamePositionWithinRequestBlock
  • PositionInformationTests.RequestDraggableLinkAtSamePositionWithinRequestBlock
  • PositionInformationTests.RequestDraggableLinkAtDifferentPositionWithinRequestBlock
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView draggableElementAtPosition:]):
(-[WKWebView requestDraggableElementAtPosition:completionBlock:]):

Uses WKContentView's position information request helpers to search for draggable elements on the page. There
are both synchronous and asynchronous versions of this, both of which retrieve a _WKDraggableElementInfo.

  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/API/Cocoa/_WKDraggableElementInfo.h: Added.
  • UIProcess/API/Cocoa/_WKDraggableElementInfo.mm: Added.

Exposes what elements are draggable at a given position as SPI (only for use in testing code, at the moment).

(-[_WKDraggableElementInfo initWithInteractionInformationAtPosition:]):
(-[_WKDraggableElementInfo copyWithZone:]):

  • UIProcess/API/Cocoa/_WKDraggableElementInfoInternal.h: Added.
  • UIProcess/ios/WKContentViewInteraction.h:
  • UIProcess/ios/WKContentViewInteraction.mm:

(-[WKContentView currentPositionInformation]):
(-[WKContentView doAfterPositionInformationUpdate:forRequest:]):
(-[WKContentView _invokeAndRemovePendingHandlersValidForCurrentPositionInformation]):

  • WebKit2.xcodeproj/project.pbxproj:

Tools:

Adds six new unit tests for retrieving interaction information at a given position in the UI process. See
WebKit2 ChangeLog for more details.

  • TestWebKitAPI/Tests/ios/PositionInformationTests.mm:

(-[_WKDraggableElementInfo expectToBeLink:image:atPoint:]):
(TestWebKitAPI::TEST):
(TestWebKitAPI::expectCGPointsToBeEqual): Deleted.

Location:
trunk
Files:
4 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r215569 r215573  
     12017-04-20  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        [WK2] -[WKContentView doAfterPositionInformationUpdate:atPosition:] should be robust against synchronous reentrancy
     4        https://bugs.webkit.org/show_bug.cgi?id=170922
     5        <rdar://problem/31634990>
     6
     7        Reviewed by Tim Horton.
     8
     9        Refactors part of the asynchronous position information mechanism introduced in
     10        <https://trac.webkit.org/changeset/215171>, and introduces infrastructure for unit testing UI-side position
     11        information requests.
     12
     13        _invokeAndRemovePendingHandlersValidForCurrentPositionInformation is a helper method on WKContentView
     14        responsible for invoking queued position information handlers after receiving a position information response
     15        from the web process. Previously, this method would iterate over the list of pending callbacks and invoke all
     16        callbacks whose requests are satisfied by the incoming position information update, saving the indices of these
     17        handled callbacks in the process. At the end, it would then remove callbacks at these indices from the array of
     18        pending callbacks. This is problematic when a synchronous position update (via
     19        ensurePositionInformationIsUpToDate:) is triggered from within one of these callbacks, since
     20        _invokeAndRemovePendingHandlersValidForCurrentPositionInformation will be called from within itself, and then we
     21        will attempt to remove a callback at the same index twice.
     22
     23        To fix this, we change the array of pending position information handlers to be an array of optionals instead.
     24        When invoking and removing pending handlers after a position information response arrives, we now mark callbacks
     25        as handled by setting them to std::nullopt. Then, when the top-level invocation to
     26        _invokeAndRemovePendingHandlersValidForCurrentPositionInformation is finished, we remove all marked handlers
     27        from the pending vector.
     28
     29        Covered by 6 new unit tests:
     30        - PositionInformationTests.FindDraggableLinkAtPosition
     31        - PositionInformationTests.RequestDraggableLinkAtPosition
     32        - PositionInformationTests.FindDraggableLinkAtDifferentPositionWithinRequestBlock
     33        - PositionInformationTests.FindDraggableLinkAtSamePositionWithinRequestBlock
     34        - PositionInformationTests.RequestDraggableLinkAtSamePositionWithinRequestBlock
     35        - PositionInformationTests.RequestDraggableLinkAtDifferentPositionWithinRequestBlock
     36
     37        * UIProcess/API/Cocoa/WKWebView.mm:
     38        (-[WKWebView draggableElementAtPosition:]):
     39        (-[WKWebView requestDraggableElementAtPosition:completionBlock:]):
     40
     41        Uses WKContentView's position information request helpers to search for draggable elements on the page. There
     42        are both synchronous and asynchronous versions of this, both of which retrieve a _WKDraggableElementInfo.
     43
     44        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
     45        * UIProcess/API/Cocoa/_WKDraggableElementInfo.h: Added.
     46        * UIProcess/API/Cocoa/_WKDraggableElementInfo.mm: Added.
     47
     48        Exposes what elements are draggable at a given position as SPI (only for use in testing code, at the moment).
     49
     50        (-[_WKDraggableElementInfo initWithInteractionInformationAtPosition:]):
     51        (-[_WKDraggableElementInfo copyWithZone:]):
     52        * UIProcess/API/Cocoa/_WKDraggableElementInfoInternal.h: Added.
     53        * UIProcess/ios/WKContentViewInteraction.h:
     54        * UIProcess/ios/WKContentViewInteraction.mm:
     55        (-[WKContentView currentPositionInformation]):
     56        (-[WKContentView doAfterPositionInformationUpdate:forRequest:]):
     57        (-[WKContentView _invokeAndRemovePendingHandlersValidForCurrentPositionInformation]):
     58        * WebKit2.xcodeproj/project.pbxproj:
     59
    1602017-04-20  Anders Carlsson  <andersca@apple.com>
    261
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r215512 r215573  
    3737#import "FullscreenClient.h"
    3838#import "IconLoadingDelegate.h"
     39#import "InteractionInformationAtPosition.h"
     40#import "InteractionInformationRequest.h"
    3941#import "LegacySessionStateCoding.h"
    4042#import "Logging.h"
     
    8486#import "WebViewImpl.h"
    8587#import "_WKDiagnosticLoggingDelegate.h"
     88#import "_WKDraggableElementInfoInternal.h"
    8689#import "_WKFindDelegate.h"
    8790#import "_WKFrameHandleInternal.h"
     
    50895092
    50905093#if PLATFORM(IOS)
     5094- (_WKDraggableElementInfo *)draggableElementAtPosition:(CGPoint)position
     5095{
     5096    [_contentView ensurePositionInformationIsUpToDate:WebKit::InteractionInformationRequest(WebCore::roundedIntPoint(position))];
     5097    return [_WKDraggableElementInfo infoWithInteractionInformationAtPosition:[_contentView currentPositionInformation]];
     5098}
     5099
     5100- (void)requestDraggableElementAtPosition:(CGPoint)position completionBlock:(void (^)(_WKDraggableElementInfo *))block
     5101{
     5102    [_contentView doAfterPositionInformationUpdate:[capturedBlock = makeBlockPtr(block)] (WebKit::InteractionInformationAtPosition information) {
     5103        capturedBlock([_WKDraggableElementInfo infoWithInteractionInformationAtPosition:information]);
     5104    } forRequest:WebKit::InteractionInformationRequest(WebCore::roundedIntPoint(position))];
     5105}
    50915106
    50925107- (CGRect)_contentVisibleRect
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r215502 r215573  
    6868
    6969@class WKBrowsingContextHandle;
     70@class _WKDraggableElementInfo;
    7071@class _WKFrameHandle;
    7172@class _WKHitTestResult;
     
    336337- (NSArray *)_simulatedItemsForSession:(id)session WK_API_AVAILABLE(ios(WK_IOS_TBA));
    337338- (void)_simulatePrepareForDataInteractionSession:(id)session completion:(dispatch_block_t)completion WK_API_AVAILABLE(ios(WK_IOS_TBA));
     339
     340- (_WKDraggableElementInfo *)draggableElementAtPosition:(CGPoint)position;
     341- (void)requestDraggableElementAtPosition:(CGPoint)position completionBlock:(void (^)(_WKDraggableElementInfo *))block;
    338342
    339343#endif // TARGET_OS_IPHONE
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h

    r215502 r215573  
    8888
    8989typedef BlockPtr<void(WebKit::InteractionInformationAtPosition)> InteractionInformationCallback;
     90typedef std::pair<WebKit::InteractionInformationRequest, InteractionInformationCallback> InteractionInformationRequestAndCallback;
    9091
    9192namespace WebKit {
     
    175176
    176177    std::optional<WebKit::InteractionInformationRequest> _outstandingPositionInformationRequest;
    177     Vector<std::pair<WebKit::InteractionInformationRequest, InteractionInformationCallback>> _pendingPositionInformationHandlers;
     178
     179    uint64_t _positionInformationCallbackDepth;
     180    Vector<std::optional<InteractionInformationRequestAndCallback>> _pendingPositionInformationHandlers;
    178181   
    179182    std::unique_ptr<WebKit::InputViewUpdateDeferrer> _inputViewUpdateDeferrer;
     
    288291- (void)_accessibilityRetrieveRectsAtSelectionOffset:(NSInteger)offset withText:(NSString *)text;
    289292
     293@property (nonatomic, readonly) WebKit::InteractionInformationAtPosition currentPositionInformation;
     294- (void)doAfterPositionInformationUpdate:(void (^)(WebKit::InteractionInformationAtPosition))action forRequest:(WebKit::InteractionInformationRequest)request;
     295- (void)ensurePositionInformationIsUpToDate:(WebKit::InteractionInformationRequest)request;
     296
    290297#if ENABLE(DATA_INTERACTION)
    291298- (void)_didPerformDataInteractionControllerOperation;
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm

    r215484 r215573  
    5858#import "WebProcessProxy.h"
    5959#import "_WKActivatedElementInfoInternal.h"
     60#import "_WKDraggableElementInfoInternal.h"
    6061#import "_WKElementAction.h"
    6162#import "_WKFocusedElementInfo.h"
     
    13071308}
    13081309
     1310- (InteractionInformationAtPosition)currentPositionInformation
     1311{
     1312    return _positionInformation;
     1313}
     1314
    13091315- (void)doAfterPositionInformationUpdate:(void (^)(InteractionInformationAtPosition))action forRequest:(InteractionInformationRequest)request
    13101316{
     
    13151321    }
    13161322
    1317     _pendingPositionInformationHandlers.append({ request, action });
     1323    _pendingPositionInformationHandlers.append(InteractionInformationRequestAndCallback(request, action));
    13181324
    13191325    if (![self _hasValidOutstandingPositionInformationRequest:request])
     
    13621368    ASSERT(_hasValidPositionInformation);
    13631369
    1364     Vector<size_t> indicesOfHandledRequests;
     1370    ++_positionInformationCallbackDepth;
     1371    auto updatedPositionInformation = _positionInformation;
     1372
    13651373    for (size_t index = 0; index < _pendingPositionInformationHandlers.size(); ++index) {
    1366         auto& requestAndHandler = _pendingPositionInformationHandlers[index];
    1367         if (![self _currentPositionInformationIsValidForRequest:requestAndHandler.first])
     1374        auto requestAndHandler = _pendingPositionInformationHandlers[index];
     1375        if (!requestAndHandler)
    13681376            continue;
    13691377
    1370         if (requestAndHandler.second)
    1371             requestAndHandler.second(_positionInformation);
    1372 
    1373         indicesOfHandledRequests.append(index);
    1374     }
    1375 
    1376     while (indicesOfHandledRequests.size())
    1377         _pendingPositionInformationHandlers.remove(indicesOfHandledRequests.takeLast());
     1378        if (![self _currentPositionInformationIsValidForRequest:requestAndHandler->first])
     1379            continue;
     1380
     1381        _pendingPositionInformationHandlers[index] = std::nullopt;
     1382
     1383        if (requestAndHandler->second)
     1384            requestAndHandler->second(updatedPositionInformation);
     1385    }
     1386
     1387    if (--_positionInformationCallbackDepth)
     1388        return;
     1389
     1390    for (int index = _pendingPositionInformationHandlers.size() - 1; index >= 0; --index) {
     1391        if (!_pendingPositionInformationHandlers[index])
     1392            _pendingPositionInformationHandlers.remove(index);
     1393    }
    13781394}
    13791395
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r215521 r215573  
    20112011                F44DFEB21E9E752F0038D196 /* WebIconUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = F44DFEB01E9E752F0038D196 /* WebIconUtilities.h */; };
    20122012                F44DFEB31E9E752F0038D196 /* WebIconUtilities.mm in Sources */ = {isa = PBXBuildFile; fileRef = F44DFEB11E9E752F0038D196 /* WebIconUtilities.mm */; };
     2013                F4E8CB911EA6AB5B00E31198 /* _WKDraggableElementInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E8CB8E1EA6AB5B00E31198 /* _WKDraggableElementInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2014                F4E8CB921EA6AB5B00E31198 /* _WKDraggableElementInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4E8CB8F1EA6AB5B00E31198 /* _WKDraggableElementInfo.mm */; };
     2015                F4E8CB931EA6AB5B00E31198 /* _WKDraggableElementInfoInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E8CB901EA6AB5B00E31198 /* _WKDraggableElementInfoInternal.h */; };
    20132016                F6113E25126CE1820057D0A7 /* APIUserContentURLPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = F6113E24126CE1820057D0A7 /* APIUserContentURLPattern.h */; };
    20142017                F6113E28126CE19B0057D0A7 /* WKUserContentURLPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6113E26126CE19B0057D0A7 /* WKUserContentURLPattern.cpp */; };
     
    43464349                F44DFEB01E9E752F0038D196 /* WebIconUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebIconUtilities.h; path = ios/WebIconUtilities.h; sourceTree = "<group>"; };
    43474350                F44DFEB11E9E752F0038D196 /* WebIconUtilities.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebIconUtilities.mm; path = ios/WebIconUtilities.mm; sourceTree = "<group>"; };
     4351                F4E8CB8E1EA6AB5B00E31198 /* _WKDraggableElementInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKDraggableElementInfo.h; sourceTree = "<group>"; };
     4352                F4E8CB8F1EA6AB5B00E31198 /* _WKDraggableElementInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKDraggableElementInfo.mm; sourceTree = "<group>"; };
     4353                F4E8CB901EA6AB5B00E31198 /* _WKDraggableElementInfoInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKDraggableElementInfoInternal.h; sourceTree = "<group>"; };
    43484354                F6113E24126CE1820057D0A7 /* APIUserContentURLPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIUserContentURLPattern.h; sourceTree = "<group>"; };
    43494355                F6113E26126CE19B0057D0A7 /* WKUserContentURLPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKUserContentURLPattern.cpp; sourceTree = "<group>"; };
     
    55295535                                A1A4FE6018DD54A400B5EA8A /* _WKDownloadDelegate.h */,
    55305536                                A1A4FE5918DCE9FA00B5EA8A /* _WKDownloadInternal.h */,
     5537                                F4E8CB8E1EA6AB5B00E31198 /* _WKDraggableElementInfo.h */,
     5538                                F4E8CB8F1EA6AB5B00E31198 /* _WKDraggableElementInfo.mm */,
     5539                                F4E8CB901EA6AB5B00E31198 /* _WKDraggableElementInfoInternal.h */,
    55315540                                379A873818BBFE0F00588AF2 /* _WKElementAction.h */,
    55325541                                379A873718BBFE0F00588AF2 /* _WKElementAction.mm */,
     
    80558064                        sourceTree = "<group>";
    80568065                };
     8066                F4D7BCCA1EA494FA00C421D3 /* Recovered References */ = {
     8067                        isa = PBXGroup;
     8068                        children = (
     8069                                C58CDF281887548B00871536 /* InteractionInformationAtPosition.h */,
     8070                        );
     8071                        name = "Recovered References";
     8072                        sourceTree = "<group>";
     8073                };
    80578074                F638955A133BF57D008941D5 /* mac */ = {
    80588075                        isa = PBXGroup;
     
    82128229                                2D8786241BDB58FF00D02ABB /* APIUserStyleSheet.h in Headers */,
    82138230                                C5E1AFED16B21017006CC1F2 /* APIWebArchive.h in Headers */,
     8231                                F4E8CB931EA6AB5B00E31198 /* _WKDraggableElementInfoInternal.h in Headers */,
    82148232                                C5E1AFEF16B21029006CC1F2 /* APIWebArchiveResource.h in Headers */,
    82158233                                1AE286841C7F93860069AC4F /* APIWebsiteDataRecord.h in Headers */,
     
    88848902                                1A4D664C18A3030E00D82E21 /* WKFrameInfo.h in Headers */,
    88858903                                2DF9EEE81A78245500B6CFBE /* WKFrameInfoInternal.h in Headers */,
     8904                                F4E8CB911EA6AB5B00E31198 /* _WKDraggableElementInfo.h in Headers */,
    88868905                                1A6FA21E1BD0435B00AAA650 /* WKFrameInfoPrivate.h in Headers */,
    88878906                                2D3A65E71A7C3AA700CAC637 /* WKFrameInfoRef.h in Headers */,
     
    1052510544                                93A253F51C92413200F9F68D /* WKPreviewActionItemIdentifiers.mm in Sources */,
    1052610545                                9395E68C1BF2C35200F49BCE /* WKPreviewElementInfo.mm in Sources */,
     10546                                F4E8CB921EA6AB5B00E31198 /* _WKDraggableElementInfo.mm in Sources */,
    1052710547                                0FCB4E6718BBE3D9000FCFC9 /* WKPrintingView.mm in Sources */,
    1052810548                                BCBAACEC145225E30053F82F /* WKProcessGroup.mm in Sources */,
  • trunk/Tools/ChangeLog

    r215556 r215573  
     12017-04-20  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        [WK2] -[WKContentView doAfterPositionInformationUpdate:atPosition:] should be robust against synchronous reentrancy
     4        https://bugs.webkit.org/show_bug.cgi?id=170922
     5        <rdar://problem/31634990>
     6
     7        Reviewed by Tim Horton.
     8
     9        Adds six new unit tests for retrieving interaction information at a given position in the UI process. See
     10        WebKit2 ChangeLog for more details.
     11
     12        * TestWebKitAPI/Tests/ios/PositionInformationTests.mm:
     13        (-[_WKDraggableElementInfo expectToBeLink:image:atPoint:]):
     14        (TestWebKitAPI::TEST):
     15        (TestWebKitAPI::expectCGPointsToBeEqual): Deleted.
     16
    1172017-04-20  Xan Lopez  <xlopez@igalia.com>
    218
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r215536 r215573  
    599599                F4D4F3B61E4E2BCB00BB2767 /* DataInteractionSimulator.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4D4F3B41E4E2BCB00BB2767 /* DataInteractionSimulator.mm */; };
    600600                F4D4F3B91E4E36E400BB2767 /* DataInteractionTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4D4F3B71E4E36E400BB2767 /* DataInteractionTests.mm */; };
     601                F4D7BCD81EA5789800C421D3 /* PositionInformationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4D7BCD61EA574DD00C421D3 /* PositionInformationTests.mm */; };
    601602                F4DEF6ED1E9B4DB60048EF61 /* image-in-link-and-input.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4DEF6EC1E9B4D950048EF61 /* image-in-link-and-input.html */; };
    602603                F4F137921D9B683E002BEC57 /* large-video-test-now-playing.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4F137911D9B6832002BEC57 /* large-video-test-now-playing.html */; };
     
    14841485                F4D4F3B51E4E2BCB00BB2767 /* DataInteractionSimulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataInteractionSimulator.h; sourceTree = "<group>"; };
    14851486                F4D4F3B71E4E36E400BB2767 /* DataInteractionTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DataInteractionTests.mm; sourceTree = "<group>"; };
     1487                F4D7BCD61EA574DD00C421D3 /* PositionInformationTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PositionInformationTests.mm; sourceTree = "<group>"; };
    14861488                F4DEF6EC1E9B4D950048EF61 /* image-in-link-and-input.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "image-in-link-and-input.html"; sourceTree = "<group>"; };
    14871489                F4F137911D9B6832002BEC57 /* large-video-test-now-playing.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "large-video-test-now-playing.html"; sourceTree = "<group>"; };
     
    18141816                                F4D4F3B71E4E36E400BB2767 /* DataInteractionTests.mm */,
    18151817                                7560917719259C59009EF06E /* MemoryCacheAddImageToCacheIOS.mm */,
     1818                                F4D7BCD61EA574DD00C421D3 /* PositionInformationTests.mm */,
    18161819                        );
    18171820                        path = ios;
     
    29192922                                7CCE7EAF1A411A3800447C4C /* PlatformUtilities.cpp in Sources */,
    29202923                                0F139E781A423A6B00F590F5 /* PlatformUtilitiesCocoa.mm in Sources */,
     2924                                F4D7BCD81EA5789800C421D3 /* PositionInformationTests.mm in Sources */,
    29212925                                7CCE7EA61A411A0F00447C4C /* PlatformUtilitiesMac.mm in Sources */,
    29222926                                7CCE7EA71A411A1300447C4C /* PlatformWebViewMac.mm in Sources */,
Note: See TracChangeset for help on using the changeset viewer.