0c7a7c708c92475da0e0b6f27fef0dcacf6f9e10
[WebKit-https.git] / Tools / DumpRenderTree / TestOptions.mm
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "TestOptions.h"
28
29 #include <Foundation/Foundation.h>
30 #include <fstream>
31 #include <string>
32
33 static bool parseBooleanTestHeaderValue(const std::string& value)
34 {
35     if (value == "true")
36         return true;
37     if (value == "false")
38         return false;
39
40     NSLog(@"Found unexpected value '%s' for boolean option. Expected 'true' or 'false'.", value.c_str());
41     return false;
42 }
43
44 TestOptions::TestOptions(NSURL *testURL, const TestCommand& command)
45 {
46     std::string path = command.absolutePath;
47     if (path.empty()) {
48         path = [testURL isFileURL] ? [testURL fileSystemRepresentation] : command.pathOrURL;
49         if (path.empty())
50             return;
51     }
52
53     std::string options;
54     std::ifstream testFile(path.data());
55     if (!testFile.good())
56         return;
57     getline(testFile, options);
58     std::string beginString("webkit-test-runner [ ");
59     std::string endString(" ]");
60     size_t beginLocation = options.find(beginString);
61     if (beginLocation == std::string::npos)
62         return;
63     size_t endLocation = options.find(endString, beginLocation);
64     if (endLocation == std::string::npos) {
65         NSLog(@"Could not find end of test header in %s", path.c_str());
66         return;
67     }
68     std::string pairString = options.substr(beginLocation + beginString.size(), endLocation - (beginLocation + beginString.size()));
69     size_t pairStart = 0;
70     while (pairStart < pairString.size()) {
71         size_t pairEnd = pairString.find(" ", pairStart);
72         if (pairEnd == std::string::npos)
73             pairEnd = pairString.size();
74         size_t equalsLocation = pairString.find("=", pairStart);
75         if (equalsLocation == std::string::npos) {
76             NSLog(@"Malformed option in test header (could not find '=' character) in %s", path.c_str());
77             break;
78         }
79         auto key = pairString.substr(pairStart, equalsLocation - pairStart);
80         auto value = pairString.substr(equalsLocation + 1, pairEnd - (equalsLocation + 1));
81         if (key == "enableIntersectionObserver")
82             this->enableIntersectionObserver = parseBooleanTestHeaderValue(value);
83         else if (key == "enableModernMediaControls")
84             this->enableModernMediaControls = parseBooleanTestHeaderValue(value);
85         else if (key == "enablePointerLock")
86             this->enablePointerLock = parseBooleanTestHeaderValue(value);
87         else if (key == "enableCredentialManagement")
88             this->enableCredentialManagement = parseBooleanTestHeaderValue(value);
89         else if (key == "enableDragDestinationActionLoad")
90             this->enableDragDestinationActionLoad = parseBooleanTestHeaderValue(value);
91         else if (key == "layerBackedWebView")
92             this->layerBackedWebView = parseBooleanTestHeaderValue(value);
93         else if (key == "enableIsSecureContextAttribute")
94             this->enableIsSecureContextAttribute = parseBooleanTestHeaderValue(value);
95         else if (key == "enableInspectorAdditions")
96             this->enableInspectorAdditions = parseBooleanTestHeaderValue(value);
97         pairStart = pairEnd + 1;
98     }
99 }
100
101 bool TestOptions::webViewIsCompatibleWithOptions(const TestOptions& other) const
102 {
103     return other.layerBackedWebView == layerBackedWebView;
104 }