Prepare to use CSS selectors in content extensions.
[WebKit-https.git] / Source / WebCore / contentextensions / ContentExtensionRule.cpp
1 /*
2  * Copyright (C) 2014, 2015 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 "ContentExtensionRule.h"
28
29 #if ENABLE(CONTENT_EXTENSIONS)
30
31 namespace WebCore {
32
33 namespace ContentExtensions {
34
35 ContentExtensionRule::ContentExtensionRule(const Trigger& trigger, const Action& action)
36     : m_trigger(trigger)
37     , m_action(action)
38 {
39     ASSERT(!m_trigger.urlFilter.isEmpty());
40 }
41
42 Action Action::deserialize(const Vector<SerializedActionByte>& actions, unsigned location)
43 {
44     switch (static_cast<ActionType>(actions[location])) {
45     case ActionType::BlockCookies:
46         return ActionType::BlockCookies;
47     case ActionType::BlockLoad:
48         return ActionType::BlockLoad;
49     case ActionType::IgnorePreviousRules:
50         return ActionType::IgnorePreviousRules;
51     case ActionType::InvalidAction:
52         RELEASE_ASSERT_NOT_REACHED();
53     case ActionType::CSSDisplayNone: {
54         unsigned stringStartIndex = location + sizeof(ActionType) + sizeof(unsigned) + sizeof(bool);
55         RELEASE_ASSERT(actions.size() >= stringStartIndex);
56         unsigned selectorLength = *reinterpret_cast<const unsigned*>(&actions[location + sizeof(ActionType)]);
57         bool wideCharacters = actions[location + sizeof(ActionType) + sizeof(unsigned)];
58         
59         if (wideCharacters) {
60             RELEASE_ASSERT(actions.size() >= stringStartIndex + selectorLength * sizeof(UChar));
61             return Action(ActionType::CSSDisplayNone, String(reinterpret_cast<const UChar*>(&actions[stringStartIndex]), selectorLength));
62         }
63         RELEASE_ASSERT(actions.size() >= stringStartIndex + selectorLength * sizeof(LChar));
64         return Action(ActionType::CSSDisplayNone, String(reinterpret_cast<const LChar*>(&actions[stringStartIndex]), selectorLength));
65     }
66     }
67 }
68
69 }
70
71 } // namespace WebCore
72
73 #endif // ENABLE(CONTENT_EXTENSIONS)