1 /* 2 * Copyright (c) 2010, Google 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 are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef PlatformBridge_h 32 #define PlatformBridge_h 33 34 #if ENABLE(WEB_AUDIO) 35 #include "AudioBus.h" 36 #endif 37 38 #include "FileSystem.h" 39 #include "ImageSource.h" 40 #include "LinkHash.h" 41 #include "PassRefPtr.h" 42 #include "PasteboardPrivate.h" 43 #include "PluginData.h" 44 45 #include <wtf/Forward.h> 46 #include <wtf/HashSet.h> 47 #include <wtf/Vector.h> 48 49 typedef struct NPObject NPObject; 50 typedef struct _NPP NPP_t; 51 typedef NPP_t* NPP; 52 53 #if OS(DARWIN) 54 typedef struct CGFont* CGFontRef; 55 typedef uintptr_t ATSFontContainerRef; 56 #ifdef __OBJC__ 57 @class NSFont; 58 #else 59 class NSFont; 60 #endif 61 #endif // OS(DARWIN) 62 63 #if OS(WINDOWS) 64 typedef struct HFONT__* HFONT; 65 #endif 66 67 namespace WebCore { 68 69 class ClipboardData; 70 class Color; 71 class Cursor; 72 class Document; 73 class Frame; 74 class GeolocationServiceBridge; 75 class GeolocationServiceChromium; 76 class GraphicsContext; 77 class Image; 78 class IDBFactoryBackendInterface; 79 class IDBKey; 80 class IntRect; 81 class KURL; 82 class SerializedScriptValue; 83 class Widget; 84 85 struct Cookie; 86 struct FontRenderStyle; 87 88 // An interface to the embedding layer, which has the ability to answer 89 // questions about the system and so on... 90 91 class PlatformBridge { 92 public: 93 // Cache -------------------------------------------------------------- 94 static void cacheMetadata(const KURL&, double responseTime, const Vector<char>&); 95 96 // Clipboard ---------------------------------------------------------- 97 static bool clipboardIsFormatAvailable(PasteboardPrivate::ClipboardFormat, PasteboardPrivate::ClipboardBuffer); 98 99 static String clipboardReadPlainText(PasteboardPrivate::ClipboardBuffer); 100 static void clipboardReadHTML(PasteboardPrivate::ClipboardBuffer, String*, KURL*); 101 static PassRefPtr<SharedBuffer> clipboardReadImage(PasteboardPrivate::ClipboardBuffer); 102 103 // Only the clipboardRead functions take a buffer argument because 104 // Chromium currently uses a different technique to write to alternate 105 // clipboard buffers. 106 static void clipboardWriteSelection(const String&, const KURL&, const String&, bool); 107 static void clipboardWritePlainText(const String&); 108 static void clipboardWriteURL(const KURL&, const String&); 109 static void clipboardWriteImage(NativeImagePtr, const KURL&, const String&); 110 static void clipboardWriteData(const String& type, const String& data, const String& metadata); 111 112 // Interface for handling copy and paste, drag and drop, and selection copy. 113 static HashSet<String> clipboardReadAvailableTypes(PasteboardPrivate::ClipboardBuffer, bool* containsFilenames); 114 static bool clipboardReadData(PasteboardPrivate::ClipboardBuffer, const String& type, String& data, String& metadata); 115 static Vector<String> clipboardReadFilenames(PasteboardPrivate::ClipboardBuffer); 116 117 // Cookies ------------------------------------------------------------ 118 static void setCookies(const Document*, const KURL&, const String& value); 119 static String cookies(const Document*, const KURL&); 120 static String cookieRequestHeaderFieldValue(const Document*, const KURL&); 121 static bool rawCookies(const Document*, const KURL&, Vector<Cookie>&); 122 static void deleteCookie(const Document*, const KURL&, const String& cookieName); 123 static bool cookiesEnabled(const Document*); 124 125 // DNS ---------------------------------------------------------------- 126 static void prefetchDNS(const String& hostname); 127 128 // File --------------------------------------------------------------- 129 static void revealFolderInOS(const String&); 130 static bool fileExists(const String&); 131 static bool deleteFile(const String&); 132 static bool deleteEmptyDirectory(const String&); 133 static bool getFileSize(const String&, long long& result); 134 static bool getFileModificationTime(const String&, time_t& result); 135 static String directoryName(const String& path); 136 static String pathByAppendingComponent(const String& path, const String& component); 137 static bool makeAllDirectories(const String& path); 138 static String getAbsolutePath(const String&); 139 static bool isDirectory(const String&); 140 static KURL filePathToURL(const String&); 141 static PlatformFileHandle openFile(const String& path, FileOpenMode); 142 static void closeFile(PlatformFileHandle&); 143 static long long seekFile(PlatformFileHandle, long long offset, FileSeekOrigin); 144 static bool truncateFile(PlatformFileHandle, long long offset); 145 static int readFromFile(PlatformFileHandle, char* data, int length); 146 static int writeToFile(PlatformFileHandle, const char* data, int length); 147 148 // Font --------------------------------------------------------------- 149 #if OS(WINDOWS) 150 static bool ensureFontLoaded(HFONT); 151 #endif 152 #if OS(LINUX) || OS(FREEBSD) 153 static void getRenderStyleForStrike(const char* family, int sizeAndStyle, FontRenderStyle* result); 154 static String getFontFamilyForCharacters(const UChar*, size_t numCharacters, const char* preferredLocale); 155 #endif 156 #if OS(DARWIN) 157 static bool loadFont(NSFont* srcFont, ATSFontContainerRef* out); 158 #endif 159 160 // Forms -------------------------------------------------------------- 161 static void notifyFormStateChanged(const Document*); 162 163 // Databases ---------------------------------------------------------- 164 // Returns a handle to the DB file and ooptionally a handle to its containing directory 165 static PlatformFileHandle databaseOpenFile(const String& vfsFleName, int desiredFlags); 166 // Returns a SQLite code (SQLITE_OK = 0, on success) 167 static int databaseDeleteFile(const String& vfsFileName, bool syncDir = false); 168 // Returns the attributes of the DB file 169 static long databaseGetFileAttributes(const String& vfsFileName); 170 // Returns the size of the DB file 171 static long long databaseGetFileSize(const String& vfsFileName); 172 173 // IndexedDB ---------------------------------------------------------- 174 static PassRefPtr<IDBFactoryBackendInterface> idbFactory(); 175 // Extracts keyPath from values and returns the corresponding keys. 176 static void createIDBKeysFromSerializedValuesAndKeyPath(const Vector<RefPtr<SerializedScriptValue> >& values, const String& keyPath, Vector<RefPtr<IDBKey> >& keys); 177 // Injects key via keyPath into value. Returns true on success. 178 static PassRefPtr<SerializedScriptValue> injectIDBKeyIntoSerializedValue(PassRefPtr<IDBKey>, PassRefPtr<SerializedScriptValue>, const String& keyPath); 179 180 // JavaScript --------------------------------------------------------- 181 static void notifyJSOutOfMemory(Frame*); 182 static bool allowScriptDespiteSettings(const KURL& documentURL); 183 184 // Keygen ------------------------------------------------------------- 185 static String signedPublicKeyAndChallengeString(unsigned keySizeIndex, const String& challenge, const KURL&); 186 187 // Language ----------------------------------------------------------- 188 static String computedDefaultLanguage(); 189 190 // LayoutTestMode ----------------------------------------------------- 191 static bool layoutTestMode(); 192 193 // Memory ------------------------------------------------------------- 194 // Returns the current space allocated for the pagefile, in MB. 195 // That is committed size for Windows and virtual memory size for POSIX 196 static int memoryUsageMB(); 197 198 // Same as above, but always returns actual value, without any caches. 199 static int actualMemoryUsageMB(); 200 201 // MimeType ----------------------------------------------------------- 202 static bool isSupportedImageMIMEType(const String& mimeType); 203 static bool isSupportedJavaScriptMIMEType(const String& mimeType); 204 static bool isSupportedNonImageMIMEType(const String& mimeType); 205 static String mimeTypeForExtension(const String& fileExtension); 206 static String mimeTypeFromFile(const String& filePath); 207 static String preferredExtensionForMIMEType(const String& mimeType); 208 209 // Plugin ------------------------------------------------------------- 210 static bool plugins(bool refresh, Vector<PluginInfo>*); 211 static NPObject* pluginScriptableObject(Widget*); 212 static bool popupsAllowed(NPP); 213 214 // Resources ---------------------------------------------------------- 215 static PassRefPtr<Image> loadPlatformImageResource(const char* name); 216 217 #if ENABLE(WEB_AUDIO) 218 static PassOwnPtr<AudioBus> loadPlatformAudioResource(const char* name, double sampleRate); 219 static PassOwnPtr<AudioBus> decodeAudioFileData(const char* data, size_t, double sampleRate); 220 #endif 221 222 // Sandbox ------------------------------------------------------------ 223 static bool sandboxEnabled(); 224 225 // Screen ------------------------------------------------------------- 226 static int screenDepth(Widget*); 227 static int screenDepthPerComponent(Widget*); 228 static bool screenIsMonochrome(Widget*); 229 static IntRect screenRect(Widget*); 230 static IntRect screenAvailableRect(Widget*); 231 232 // SharedTimers ------------------------------------------------------- 233 static void setSharedTimerFiredFunction(void (*func)()); 234 static void setSharedTimerFireTime(double); 235 static void stopSharedTimer(); 236 237 // StatsCounters ------------------------------------------------------ 238 static void decrementStatsCounter(const char* name); 239 static void incrementStatsCounter(const char* name); 240 static void histogramCustomCounts(const char* name, int sample, int min, int max, int bucketCount); 241 static void histogramEnumeration(const char* name, int sample, int boundaryValue); 242 243 // Sudden Termination 244 static void suddenTerminationChanged(bool enabled); 245 246 // SystemTime --------------------------------------------------------- 247 static double currentTime(); 248 249 // Theming ------------------------------------------------------------ 250 #if OS(WINDOWS) 251 static void paintButton( 252 GraphicsContext*, int part, int state, int classicState, const IntRect&); 253 static void paintMenuList( 254 GraphicsContext*, int part, int state, int classicState, const IntRect&); 255 static void paintScrollbarArrow( 256 GraphicsContext*, int state, int classicState, const IntRect&); 257 static void paintScrollbarThumb( 258 GraphicsContext*, int part, int state, int classicState, const IntRect&); 259 static void paintScrollbarTrack( 260 GraphicsContext*, int part, int state, int classicState, const IntRect&, const IntRect& alignRect); 261 static void paintSpinButton( 262 GraphicsContext*, int part, int state, int classicState, const IntRect&); 263 static void paintTextField( 264 GraphicsContext*, int part, int state, int classicState, const IntRect&, const Color&, bool fillContentArea, bool drawEdges); 265 static void paintTrackbar( 266 GraphicsContext*, int part, int state, int classicState, const IntRect&); 267 static void paintProgressBar( 268 GraphicsContext*, const IntRect& barRect, const IntRect& valueRect, bool determinate, double animatedSeconds); 269 #elif OS(LINUX) 270 // The UI part which is being accessed. 271 enum ThemePart { 272 // ScrollbarTheme parts 273 PartScrollbarDownArrow, 274 PartScrollbarLeftArrow, 275 PartScrollbarRightArrow, 276 PartScrollbarUpArrow, 277 PartScrollbarHorizontalThumb, 278 PartScrollbarVerticalThumb, 279 PartScrollbarHorizontalTrack, 280 PartScrollbarVerticalTrack, 281 282 // RenderTheme parts 283 PartCheckbox, 284 PartRadio, 285 PartButton, 286 PartTextField, 287 PartMenuList, 288 PartSliderTrack, 289 PartSliderThumb, 290 PartInnerSpinButton, 291 PartProgressBar 292 }; 293 294 // The current state of the associated Part. 295 enum ThemePaintState { 296 StateDisabled, 297 StateHover, 298 StateNormal, 299 StatePressed 300 }; 301 302 struct ScrollbarTrackExtraParams { 303 // The bounds of the entire track, as opposed to the part being painted. 304 int trackX; 305 int trackY; 306 int trackWidth; 307 int trackHeight; 308 }; 309 310 struct ButtonExtraParams { 311 bool checked; 312 bool indeterminate; // Whether the button state is indeterminate. 313 bool isDefault; // Whether the button is default button. 314 bool hasBorder; 315 unsigned backgroundColor; 316 }; 317 318 struct TextFieldExtraParams { 319 bool isTextArea; 320 bool isListbox; 321 unsigned backgroundColor; 322 }; 323 324 struct MenuListExtraParams { 325 bool hasBorder; 326 bool hasBorderRadius; 327 int arrowX; 328 int arrowY; 329 unsigned backgroundColor; 330 }; 331 332 struct SliderExtraParams { 333 bool vertical; 334 bool inDrag; 335 }; 336 337 struct InnerSpinButtonExtraParams { 338 bool spinUp; 339 bool readOnly; 340 }; 341 342 struct ProgressBarExtraParams { 343 bool determinate; 344 int valueRectX; 345 int valueRectY; 346 int valueRectWidth; 347 int valueRectHeight; 348 }; 349 350 union ThemePaintExtraParams { 351 ScrollbarTrackExtraParams scrollbarTrack; 352 ButtonExtraParams button; 353 TextFieldExtraParams textField; 354 MenuListExtraParams menuList; 355 SliderExtraParams slider; 356 InnerSpinButtonExtraParams innerSpin; 357 ProgressBarExtraParams progressBar; 358 }; 359 360 // Gets the size of the given theme part. For variable sized items 361 // like vertical scrollbar thumbs, the width will be the required width of 362 // the track while the height will be the minimum height. 363 static IntSize getThemePartSize(ThemePart); 364 // Paint the given the given theme part. 365 static void paintThemePart(GraphicsContext*, ThemePart, ThemePaintState, const IntRect&, const ThemePaintExtraParams*); 366 #elif OS(DARWIN) 367 enum ThemePaintState { 368 StateDisabled, 369 StateInactive, 370 StateActive, 371 StatePressed, 372 }; 373 374 enum ThemePaintSize { 375 SizeRegular, 376 SizeSmall, 377 }; 378 379 enum ThemePaintScrollbarOrientation { 380 ScrollbarOrientationHorizontal, 381 ScrollbarOrientationVertical, 382 }; 383 384 enum ThemePaintScrollbarParent { 385 ScrollbarParentScrollView, 386 ScrollbarParentRenderLayer, 387 }; 388 389 struct ThemePaintScrollbarInfo { 390 ThemePaintScrollbarOrientation orientation; 391 ThemePaintScrollbarParent parent; 392 int maxValue; 393 int currentValue; 394 int visibleSize; 395 int totalSize; 396 }; 397 398 static void paintScrollbarThumb(GraphicsContext*, ThemePaintState, ThemePaintSize, const IntRect&, const ThemePaintScrollbarInfo&); 399 #endif 400 401 // Trace Event -------------------------------------------------------- 402 static void traceEventBegin(const char* name, void*, const char* extra); 403 static void traceEventEnd(const char* name, void*, const char* extra); 404 405 // Visited links ------------------------------------------------------ 406 static LinkHash visitedLinkHash(const UChar* url, unsigned length); 407 static LinkHash visitedLinkHash(const KURL& base, const AtomicString& attributeURL); 408 static bool isLinkVisited(LinkHash); 409 }; 410 411 } // namespace WebCore 412 413 #endif 414