/*
 * Copyright (C) 2015 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#pragma once

#if ENABLE(CONTENT_EXTENSIONS)

#include <wtf/HashSet.h>
#include <wtf/text/WTFString.h>

namespace WebCore {

class Page;
class ResourceRequest;

namespace ContentExtensions {

typedef uint8_t SerializedActionByte;

enum class ActionType : uint8_t {
    BlockLoad,
    BlockCookies,
    CSSDisplayNoneSelector,
    Notify,
    IgnorePreviousRules,
    MakeHTTPS,
};

static inline bool hasStringArgument(ActionType actionType)
{
    switch (actionType) {
    case ActionType::CSSDisplayNoneSelector:
    case ActionType::Notify:
        return true;
    case ActionType::BlockLoad:
    case ActionType::BlockCookies:
    case ActionType::IgnorePreviousRules:
    case ActionType::MakeHTTPS:
        return false;
    }
    ASSERT_NOT_REACHED();
    return false;
}

struct BlockedStatus {
    bool blockedLoad { false };
    bool blockedCookies { false };
    bool madeHTTPS { false };
    HashSet<std::pair<String, String>> notifications;
};

WEBCORE_EXPORT void applyBlockedStatusToRequest(const BlockedStatus&, Page*, ResourceRequest&);

} // namespace ContentExtensions

} // namespace WebCore

#endif // ENABLE(CONTENT_EXTENSIONS)
