gfx/skia/trunk/src/views/SkOSMenu.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

michael@0 1 /*
michael@0 2 * Copyright 2011 Google Inc.
michael@0 3 *
michael@0 4 * Use of this source code is governed by a BSD-style license that can be
michael@0 5 * found in the LICENSE file.
michael@0 6 */
michael@0 7 #include <stdarg.h>
michael@0 8 #include "SkOSMenu.h"
michael@0 9 #include "SkThread.h"
michael@0 10
michael@0 11 static int gOSMenuCmd = 7000;
michael@0 12
michael@0 13 SkOSMenu::SkOSMenu(const char title[]) {
michael@0 14 fTitle.set(title);
michael@0 15 }
michael@0 16
michael@0 17 SkOSMenu::~SkOSMenu() {
michael@0 18 this->reset();
michael@0 19 }
michael@0 20
michael@0 21 void SkOSMenu::reset() {
michael@0 22 fItems.deleteAll();
michael@0 23 fTitle.reset();
michael@0 24 }
michael@0 25
michael@0 26 const SkOSMenu::Item* SkOSMenu::getItemByID(int itemID) const {
michael@0 27 for (int i = 0; i < fItems.count(); ++i) {
michael@0 28 if (itemID == fItems[i]->getID())
michael@0 29 return fItems[i];
michael@0 30 }
michael@0 31 return NULL;
michael@0 32 }
michael@0 33
michael@0 34 void SkOSMenu::getItems(const SkOSMenu::Item* items[]) const {
michael@0 35 if (NULL != items) {
michael@0 36 for (int i = 0; i < fItems.count(); ++i) {
michael@0 37 items[i] = fItems[i];
michael@0 38 }
michael@0 39 }
michael@0 40 }
michael@0 41
michael@0 42 void SkOSMenu::assignKeyEquivalentToItem(int itemID, SkUnichar key) {
michael@0 43 for (int i = 0; i < fItems.count(); ++i) {
michael@0 44 if (itemID == fItems[i]->getID())
michael@0 45 fItems[i]->setKeyEquivalent(key);
michael@0 46 }
michael@0 47 }
michael@0 48
michael@0 49 bool SkOSMenu::handleKeyEquivalent(SkUnichar key) {
michael@0 50 int value = 0, size = 0;
michael@0 51 bool state;
michael@0 52 SkOSMenu::TriState tristate;
michael@0 53 for (int i = 0; i < fItems.count(); ++i) {
michael@0 54 Item* item = fItems[i];
michael@0 55 if (item->getKeyEquivalent()== key) {
michael@0 56 SkString list;
michael@0 57 switch (item->getType()) {
michael@0 58 case kList_Type:
michael@0 59 SkOSMenu::FindListItemCount(*item->getEvent(), &size);
michael@0 60 SkOSMenu::FindListIndex(*item->getEvent(), item->getSlotName(), &value);
michael@0 61 value = (value + 1) % size;
michael@0 62 item->setInt(value);
michael@0 63 break;
michael@0 64 case kSwitch_Type:
michael@0 65 SkOSMenu::FindSwitchState(*item->getEvent(), item->getSlotName(), &state);
michael@0 66 item->setBool(!state);
michael@0 67 break;
michael@0 68 case kTriState_Type:
michael@0 69 SkOSMenu::FindTriState(*item->getEvent(), item->getSlotName(), &tristate);
michael@0 70 if (kOnState == tristate)
michael@0 71 tristate = kMixedState;
michael@0 72 else
michael@0 73 tristate = (SkOSMenu::TriState)((int)tristate + 1);
michael@0 74 item->setTriState(tristate);
michael@0 75 break;
michael@0 76 case kAction_Type:
michael@0 77 case kCustom_Type:
michael@0 78 case kSlider_Type:
michael@0 79 case kTextField_Type:
michael@0 80 default:
michael@0 81 break;
michael@0 82 }
michael@0 83 item->postEvent();
michael@0 84 return true;
michael@0 85 }
michael@0 86 }
michael@0 87 return false;
michael@0 88 }
michael@0 89
michael@0 90 ////////////////////////////////////////////////////////////////////////////////
michael@0 91
michael@0 92 SkOSMenu::Item::Item(const char label[], SkOSMenu::Type type,
michael@0 93 const char slotName[], SkEvent* evt) {
michael@0 94 fLabel.set(label);
michael@0 95 fSlotName.set(slotName);
michael@0 96 fType = type;
michael@0 97 fEvent = evt;
michael@0 98 fKey = 0;
michael@0 99 fID = sk_atomic_inc(&gOSMenuCmd);
michael@0 100 }
michael@0 101
michael@0 102 void SkOSMenu::Item::setBool(bool value) const {
michael@0 103 SkASSERT(SkOSMenu::kSwitch_Type == fType);
michael@0 104 fEvent->setBool(fSlotName.c_str(), value);
michael@0 105 }
michael@0 106
michael@0 107 void SkOSMenu::Item::setScalar(SkScalar value) const {
michael@0 108 SkASSERT(SkOSMenu::kSlider_Type == fType);
michael@0 109 fEvent->setScalar(fSlotName.c_str(), value);
michael@0 110 }
michael@0 111
michael@0 112 void SkOSMenu::Item::setInt(int value) const {
michael@0 113 SkASSERT(SkOSMenu::kList_Type == fType);
michael@0 114 fEvent->setS32(fSlotName.c_str(), value);
michael@0 115 }
michael@0 116
michael@0 117 void SkOSMenu::Item::setTriState(TriState value) const {
michael@0 118 SkASSERT(SkOSMenu::kTriState_Type == fType);
michael@0 119 fEvent->setS32(fSlotName.c_str(), value);
michael@0 120 }
michael@0 121
michael@0 122 void SkOSMenu::Item::setString(const char value[]) const {
michael@0 123 SkASSERT(SkOSMenu::kTextField_Type == fType);
michael@0 124 fEvent->setString(fSlotName.c_str(), value);
michael@0 125 }
michael@0 126
michael@0 127 ////////////////////////////////////////////////////////////////////////////////
michael@0 128
michael@0 129 static const char* gMenuEventType = "SkOSMenuEventType";
michael@0 130 static const char* gSlider_Min_Scalar = "SkOSMenuSlider_Min";
michael@0 131 static const char* gSlider_Max_Scalar = "SkOSMenuSlider_Max";
michael@0 132 static const char* gDelimiter = "|";
michael@0 133 static const char* gList_Items_Str = "SkOSMenuList_Items";
michael@0 134 static const char* gList_ItemCount_S32 = "SkOSMenuList_ItemCount";
michael@0 135
michael@0 136 int SkOSMenu::appendItem(const char label[], Type type, const char slotName[],
michael@0 137 SkEvent* evt) {
michael@0 138 SkOSMenu::Item* item = new Item(label, type, slotName, evt);
michael@0 139 fItems.append(1, &item);
michael@0 140 return item->getID();
michael@0 141 }
michael@0 142
michael@0 143 int SkOSMenu::appendAction(const char label[], SkEventSinkID target) {
michael@0 144 SkEvent* evt = new SkEvent(gMenuEventType, target);
michael@0 145 //Store label in event so it can be used to identify the action later
michael@0 146 evt->setString(label, label);
michael@0 147 return appendItem(label, SkOSMenu::kAction_Type, "", evt);
michael@0 148 }
michael@0 149
michael@0 150 int SkOSMenu::appendList(const char label[], const char slotName[],
michael@0 151 SkEventSinkID target, int index, const char option[], ...) {
michael@0 152 SkEvent* evt = new SkEvent(gMenuEventType, target);
michael@0 153 va_list args;
michael@0 154 if (option) {
michael@0 155 SkString str(option);
michael@0 156 va_start(args, option);
michael@0 157 int count = 1;
michael@0 158 for (const char* arg = va_arg(args, const char*); arg != NULL; arg = va_arg(args, const char*)) {
michael@0 159 str += gDelimiter;
michael@0 160 str += arg;
michael@0 161 ++count;
michael@0 162 }
michael@0 163 va_end(args);
michael@0 164 evt->setString(gList_Items_Str, str);
michael@0 165 evt->setS32(gList_ItemCount_S32, count);
michael@0 166 evt->setS32(slotName, index);
michael@0 167 }
michael@0 168 return appendItem(label, SkOSMenu::kList_Type, slotName, evt);
michael@0 169 }
michael@0 170
michael@0 171 int SkOSMenu::appendSlider(const char label[], const char slotName[],
michael@0 172 SkEventSinkID target, SkScalar min, SkScalar max,
michael@0 173 SkScalar defaultValue) {
michael@0 174 SkEvent* evt = new SkEvent(gMenuEventType, target);
michael@0 175 evt->setScalar(gSlider_Min_Scalar, min);
michael@0 176 evt->setScalar(gSlider_Max_Scalar, max);
michael@0 177 evt->setScalar(slotName, defaultValue);
michael@0 178 return appendItem(label, SkOSMenu::kSlider_Type, slotName, evt);
michael@0 179 }
michael@0 180
michael@0 181 int SkOSMenu::appendSwitch(const char label[], const char slotName[],
michael@0 182 SkEventSinkID target, bool defaultState) {
michael@0 183 SkEvent* evt = new SkEvent(gMenuEventType, target);
michael@0 184 evt->setBool(slotName, defaultState);
michael@0 185 return appendItem(label, SkOSMenu::kSwitch_Type, slotName, evt);
michael@0 186 }
michael@0 187
michael@0 188 int SkOSMenu::appendTriState(const char label[], const char slotName[],
michael@0 189 SkEventSinkID target, SkOSMenu::TriState defaultState) {
michael@0 190 SkEvent* evt = new SkEvent(gMenuEventType, target);
michael@0 191 evt->setS32(slotName, defaultState);
michael@0 192 return appendItem(label, SkOSMenu::kTriState_Type, slotName, evt);
michael@0 193 }
michael@0 194
michael@0 195 int SkOSMenu::appendTextField(const char label[], const char slotName[],
michael@0 196 SkEventSinkID target, const char placeholder[]) {
michael@0 197 SkEvent* evt = new SkEvent(gMenuEventType, target);
michael@0 198 evt->setString(slotName, placeholder);
michael@0 199 return appendItem(label, SkOSMenu::kTextField_Type, slotName, evt);
michael@0 200 }
michael@0 201
michael@0 202 bool SkOSMenu::FindListItemCount(const SkEvent& evt, int* count) {
michael@0 203 return evt.isType(gMenuEventType) && evt.findS32(gList_ItemCount_S32, count);
michael@0 204 }
michael@0 205
michael@0 206 bool SkOSMenu::FindListItems(const SkEvent& evt, SkString items[]) {
michael@0 207 if (evt.isType(gMenuEventType) && NULL != items) {
michael@0 208 const char* text = evt.findString(gList_Items_Str);
michael@0 209 if (text != NULL) {
michael@0 210 SkString temp(text);
michael@0 211 char* token = strtok((char*)temp.c_str(), gDelimiter);
michael@0 212 int index = 0;
michael@0 213 while (token != NULL) {
michael@0 214 items[index].set(token, strlen(token));
michael@0 215 token = strtok (NULL, gDelimiter);
michael@0 216 ++index;
michael@0 217 }
michael@0 218 }
michael@0 219 return true;
michael@0 220 }
michael@0 221 return false;
michael@0 222 }
michael@0 223
michael@0 224 bool SkOSMenu::FindSliderMin(const SkEvent& evt, SkScalar* min) {
michael@0 225 return evt.isType(gMenuEventType) && evt.findScalar(gSlider_Min_Scalar, min);
michael@0 226 }
michael@0 227
michael@0 228 bool SkOSMenu::FindSliderMax(const SkEvent& evt, SkScalar* max) {
michael@0 229 return evt.isType(gMenuEventType) && evt.findScalar(gSlider_Max_Scalar, max);
michael@0 230 }
michael@0 231
michael@0 232 bool SkOSMenu::FindAction(const SkEvent& evt, const char label[]) {
michael@0 233 return evt.isType(gMenuEventType) && evt.findString(label);
michael@0 234 }
michael@0 235
michael@0 236 bool SkOSMenu::FindListIndex(const SkEvent& evt, const char slotName[], int* value) {
michael@0 237 return evt.isType(gMenuEventType) && evt.findS32(slotName, value);
michael@0 238 }
michael@0 239
michael@0 240 bool SkOSMenu::FindSliderValue(const SkEvent& evt, const char slotName[], SkScalar* value) {
michael@0 241 return evt.isType(gMenuEventType) && evt.findScalar(slotName, value);
michael@0 242 }
michael@0 243
michael@0 244 bool SkOSMenu::FindSwitchState(const SkEvent& evt, const char slotName[], bool* value) {
michael@0 245 return evt.isType(gMenuEventType) && evt.findBool(slotName, value);
michael@0 246 }
michael@0 247
michael@0 248 bool SkOSMenu::FindTriState(const SkEvent& evt, const char slotName[], SkOSMenu::TriState* value) {
michael@0 249 return evt.isType(gMenuEventType) && evt.findS32(slotName, (int*)value);
michael@0 250 }
michael@0 251
michael@0 252 bool SkOSMenu::FindText(const SkEvent& evt, const char slotName[], SkString* value) {
michael@0 253 if (evt.isType(gMenuEventType)) {
michael@0 254 const char* text = evt.findString(slotName);
michael@0 255 if (!text || !*text)
michael@0 256 return false;
michael@0 257 else {
michael@0 258 value->set(text);
michael@0 259 return true;
michael@0 260 }
michael@0 261 }
michael@0 262 return false;
michael@0 263 }

mercurial