summaryrefslogtreecommitdiffstats
path: root/WebKit/chromium/src
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/chromium/src')
-rw-r--r--WebKit/chromium/src/ApplicationCacheHost.cpp84
-rw-r--r--WebKit/chromium/src/ApplicationCacheHostInternal.h20
-rw-r--r--WebKit/chromium/src/AssertMatchingEnums.cpp146
-rw-r--r--WebKit/chromium/src/AssociatedURLLoader.cpp87
-rw-r--r--WebKit/chromium/src/AssociatedURLLoader.h64
-rw-r--r--WebKit/chromium/src/AsyncFileSystemChromium.cpp175
-rw-r--r--WebKit/chromium/src/AsyncFileSystemChromium.h77
-rw-r--r--WebKit/chromium/src/AsyncFileWriterChromium.cpp93
-rw-r--r--WebKit/chromium/src/AsyncFileWriterChromium.h (renamed from WebKit/chromium/src/AutocompletePopupMenuClient.h)57
-rw-r--r--WebKit/chromium/src/AutoFillPopupMenuClient.cpp325
-rw-r--r--WebKit/chromium/src/AutoFillPopupMenuClient.h104
-rw-r--r--WebKit/chromium/src/BackForwardListClientImpl.cpp21
-rw-r--r--WebKit/chromium/src/BackForwardListClientImpl.h3
-rw-r--r--WebKit/chromium/src/BlobRegistryProxy.cpp87
-rw-r--r--WebKit/chromium/src/BlobRegistryProxy.h63
-rw-r--r--WebKit/chromium/src/ChromeClientImpl.cpp343
-rw-r--r--WebKit/chromium/src/ChromeClientImpl.h79
-rw-r--r--WebKit/chromium/src/ChromiumBridge.cpp396
-rw-r--r--WebKit/chromium/src/ChromiumThreading.cpp8
-rw-r--r--WebKit/chromium/src/CompositionUnderlineBuilder.h (renamed from WebKit/chromium/src/DebuggerAgent.h)32
-rw-r--r--WebKit/chromium/src/CompositionUnderlineVectorBuilder.cpp (renamed from WebKit/chromium/src/ProfilerAgentImpl.cpp)23
-rw-r--r--WebKit/chromium/src/CompositionUnderlineVectorBuilder.h (renamed from WebKit/chromium/src/ProfilerAgentImpl.h)30
-rw-r--r--WebKit/chromium/src/ContextMenuClientImpl.cpp85
-rw-r--r--WebKit/chromium/src/ContextMenuClientImpl.h2
-rw-r--r--WebKit/chromium/src/DOMUtilitiesPrivate.cpp2
-rw-r--r--WebKit/chromium/src/DOMUtilitiesPrivate.h5
-rw-r--r--WebKit/chromium/src/DatabaseObserver.cpp46
-rw-r--r--WebKit/chromium/src/DebuggerAgentImpl.cpp145
-rw-r--r--WebKit/chromium/src/DebuggerAgentImpl.h41
-rw-r--r--WebKit/chromium/src/DebuggerAgentManager.cpp66
-rw-r--r--WebKit/chromium/src/DebuggerAgentManager.h30
-rw-r--r--WebKit/chromium/src/DevToolsRPC.h396
-rw-r--r--WebKit/chromium/src/DevToolsRPCJS.h147
-rw-r--r--WebKit/chromium/src/DeviceOrientationClientProxy.cpp79
-rw-r--r--WebKit/chromium/src/DeviceOrientationClientProxy.h60
-rw-r--r--WebKit/chromium/src/DragClientImpl.cpp15
-rw-r--r--WebKit/chromium/src/DragClientImpl.h2
-rw-r--r--WebKit/chromium/src/DragScrollTimer.cpp126
-rw-r--r--WebKit/chromium/src/DragScrollTimer.h69
-rw-r--r--WebKit/chromium/src/EditorClientImpl.cpp64
-rw-r--r--WebKit/chromium/src/EditorClientImpl.h23
-rw-r--r--WebKit/chromium/src/EventListenerWrapper.cpp144
-rw-r--r--WebKit/chromium/src/EventListenerWrapper.h126
-rw-r--r--WebKit/chromium/src/Extensions3DChromium.cpp83
-rw-r--r--WebKit/chromium/src/ExternalPopupMenu.cpp154
-rw-r--r--WebKit/chromium/src/ExternalPopupMenu.h82
-rw-r--r--WebKit/chromium/src/FrameLoaderClientImpl.cpp387
-rw-r--r--WebKit/chromium/src/FrameLoaderClientImpl.h57
-rw-r--r--WebKit/chromium/src/FrameNetworkingContextImpl.h43
-rw-r--r--WebKit/chromium/src/GraphicsContext3D.cpp2218
-rw-r--r--WebKit/chromium/src/GraphicsContext3DChromium.cpp1051
-rw-r--r--WebKit/chromium/src/GraphicsContext3DInternal.h308
-rw-r--r--WebKit/chromium/src/IDBCallbacksProxy.cpp118
-rw-r--r--WebKit/chromium/src/IDBCallbacksProxy.h71
-rw-r--r--WebKit/chromium/src/IDBCursorBackendProxy.cpp95
-rw-r--r--WebKit/chromium/src/IDBCursorBackendProxy.h62
-rw-r--r--WebKit/chromium/src/IDBDatabaseProxy.cpp121
-rw-r--r--WebKit/chromium/src/IDBDatabaseProxy.h66
-rwxr-xr-xWebKit/chromium/src/IDBFactoryBackendProxy.cpp71
-rwxr-xr-xWebKit/chromium/src/IDBFactoryBackendProxy.h62
-rw-r--r--WebKit/chromium/src/IDBIndexBackendProxy.cpp110
-rw-r--r--WebKit/chromium/src/IDBIndexBackendProxy.h64
-rwxr-xr-xWebKit/chromium/src/IDBObjectStoreProxy.cpp136
-rwxr-xr-xWebKit/chromium/src/IDBObjectStoreProxy.h70
-rw-r--r--WebKit/chromium/src/IDBTransactionBackendProxy.cpp93
-rw-r--r--WebKit/chromium/src/IDBTransactionBackendProxy.h64
-rw-r--r--WebKit/chromium/src/IDBTransactionCallbacksProxy.cpp72
-rw-r--r--WebKit/chromium/src/IDBTransactionCallbacksProxy.h63
-rw-r--r--WebKit/chromium/src/InspectorClientImpl.cpp150
-rw-r--r--WebKit/chromium/src/InspectorClientImpl.h34
-rw-r--r--WebKit/chromium/src/InspectorFrontendClientImpl.cpp138
-rw-r--r--WebKit/chromium/src/InspectorFrontendClientImpl.h82
-rw-r--r--WebKit/chromium/src/LocalFileSystemChromium.cpp85
-rw-r--r--WebKit/chromium/src/LocalizedStrings.cpp104
-rw-r--r--WebKit/chromium/src/NotificationPresenterImpl.cpp16
-rw-r--r--WebKit/chromium/src/NotificationPresenterImpl.h5
-rw-r--r--WebKit/chromium/src/PlatformMessagePortChannel.h5
-rw-r--r--WebKit/chromium/src/ResourceHandle.cpp86
-rw-r--r--WebKit/chromium/src/SharedWorkerRepository.cpp18
-rw-r--r--WebKit/chromium/src/SpeechInputClientImpl.cpp106
-rw-r--r--WebKit/chromium/src/SpeechInputClientImpl.h80
-rw-r--r--WebKit/chromium/src/StorageAreaProxy.cpp26
-rw-r--r--WebKit/chromium/src/StorageEventDispatcherImpl.cpp7
-rw-r--r--WebKit/chromium/src/StorageNamespaceProxy.cpp19
-rw-r--r--WebKit/chromium/src/SuggestionsPopupMenuClient.cpp186
-rw-r--r--WebKit/chromium/src/SuggestionsPopupMenuClient.h109
-rw-r--r--WebKit/chromium/src/ToolsAgent.h66
-rw-r--r--WebKit/chromium/src/VideoFrameChromiumImpl.cpp128
-rw-r--r--WebKit/chromium/src/VideoFrameChromiumImpl.h68
-rw-r--r--WebKit/chromium/src/WebAccessibilityCache.cpp5
-rw-r--r--WebKit/chromium/src/WebAccessibilityCacheImpl.cpp28
-rw-r--r--WebKit/chromium/src/WebAccessibilityCacheImpl.h2
-rw-r--r--WebKit/chromium/src/WebAccessibilityObject.cpp136
-rw-r--r--WebKit/chromium/src/WebAnimationControllerImpl.cpp20
-rw-r--r--WebKit/chromium/src/WebAnimationControllerImpl.h6
-rw-r--r--WebKit/chromium/src/WebAttribute.cpp68
-rw-r--r--WebKit/chromium/src/WebAudioBus.cpp130
-rw-r--r--WebKit/chromium/src/WebBindings.cpp91
-rw-r--r--WebKit/chromium/src/WebBlobData.cpp131
-rw-r--r--WebKit/chromium/src/WebCString.cpp26
-rw-r--r--WebKit/chromium/src/WebCache.cpp33
-rw-r--r--WebKit/chromium/src/WebCommon.cpp44
-rw-r--r--WebKit/chromium/src/WebDOMEvent.cpp (renamed from WebKit/chromium/src/WebEvent.cpp)68
-rw-r--r--WebKit/chromium/src/WebDOMEventListener.cpp (renamed from WebKit/chromium/src/WebEventListener.cpp)128
-rw-r--r--WebKit/chromium/src/WebDOMEventListenerPrivate.cpp (renamed from WebKit/chromium/src/WebEventListenerPrivate.cpp)174
-rw-r--r--WebKit/chromium/src/WebDOMEventListenerPrivate.h (renamed from WebKit/chromium/src/WebEventListenerPrivate.h)190
-rw-r--r--WebKit/chromium/src/WebDOMMouseEvent.cpp110
-rw-r--r--WebKit/chromium/src/WebDOMMutationEvent.cpp65
-rw-r--r--WebKit/chromium/src/WebDOMStringList.cpp89
-rw-r--r--WebKit/chromium/src/WebDataSourceImpl.cpp12
-rw-r--r--WebKit/chromium/src/WebDataSourceImpl.h8
-rw-r--r--WebKit/chromium/src/WebDatabase.cpp92
-rw-r--r--WebKit/chromium/src/WebDevToolsAgentImpl.cpp566
-rw-r--r--WebKit/chromium/src/WebDevToolsAgentImpl.h62
-rw-r--r--WebKit/chromium/src/WebDevToolsAgentPrivate.h9
-rw-r--r--WebKit/chromium/src/WebDevToolsFrontendImpl.cpp298
-rw-r--r--WebKit/chromium/src/WebDevToolsFrontendImpl.h95
-rw-r--r--WebKit/chromium/src/WebDeviceOrientation.cpp86
-rw-r--r--WebKit/chromium/src/WebDeviceOrientationClientMock.cpp76
-rw-r--r--WebKit/chromium/src/WebDeviceOrientationController.cpp47
-rw-r--r--WebKit/chromium/src/WebDocument.cpp84
-rw-r--r--WebKit/chromium/src/WebDocumentType.cpp64
-rw-r--r--WebKit/chromium/src/WebDragData.cpp86
-rw-r--r--WebKit/chromium/src/WebElement.cpp47
-rw-r--r--WebKit/chromium/src/WebEntities.cpp73
-rw-r--r--WebKit/chromium/src/WebEntities.h7
-rw-r--r--WebKit/chromium/src/WebFileChooserCompletionImpl.cpp2
-rw-r--r--WebKit/chromium/src/WebFileChooserCompletionImpl.h9
-rw-r--r--WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp102
-rw-r--r--WebKit/chromium/src/WebFileSystemCallbacksImpl.h71
-rw-r--r--WebKit/chromium/src/WebFontDescription.cpp71
-rw-r--r--WebKit/chromium/src/WebFontImpl.cpp128
-rw-r--r--WebKit/chromium/src/WebFontImpl.h (renamed from WebKit/chromium/src/ProfilerAgent.h)51
-rw-r--r--WebKit/chromium/src/WebFormControlElement.cpp85
-rw-r--r--WebKit/chromium/src/WebFormElement.cpp66
-rw-r--r--WebKit/chromium/src/WebFrameImpl.cpp521
-rw-r--r--WebKit/chromium/src/WebFrameImpl.h63
-rw-r--r--WebKit/chromium/src/WebGeolocationError.cpp67
-rw-r--r--WebKit/chromium/src/WebGeolocationPosition.cpp61
-rw-r--r--WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp202
-rw-r--r--WebKit/chromium/src/WebGeolocationServiceBridgeImpl.h43
-rw-r--r--WebKit/chromium/src/WebGeolocationServiceMock.cpp277
-rw-r--r--WebKit/chromium/src/WebGraphicsContext3D.cpp (renamed from WebKit/chromium/src/APUAgentDelegate.h)21
-rw-r--r--WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp1634
-rw-r--r--WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.h383
-rw-r--r--WebKit/chromium/src/WebHTTPBody.cpp42
-rw-r--r--WebKit/chromium/src/WebHTTPLoadInfo.cpp111
-rw-r--r--WebKit/chromium/src/WebHistoryItem.cpp68
-rw-r--r--WebKit/chromium/src/WebIDBCallbacksImpl.cpp106
-rw-r--r--WebKit/chromium/src/WebIDBCallbacksImpl.h62
-rw-r--r--WebKit/chromium/src/WebIDBCursorImpl.cpp88
-rw-r--r--WebKit/chromium/src/WebIDBCursorImpl.h58
-rw-r--r--WebKit/chromium/src/WebIDBDatabaseError.cpp86
-rw-r--r--WebKit/chromium/src/WebIDBDatabaseImpl.cpp105
-rw-r--r--WebKit/chromium/src/WebIDBDatabaseImpl.h64
-rwxr-xr-xWebKit/chromium/src/WebIDBFactoryImpl.cpp68
-rwxr-xr-xWebKit/chromium/src/WebIDBFactoryImpl.h53
-rw-r--r--WebKit/chromium/src/WebIDBIndexImpl.cpp93
-rw-r--r--WebKit/chromium/src/WebIDBIndexImpl.h60
-rw-r--r--WebKit/chromium/src/WebIDBKey.cpp130
-rw-r--r--WebKit/chromium/src/WebIDBKeyPath.cpp77
-rw-r--r--WebKit/chromium/src/WebIDBKeyRange.cpp131
-rwxr-xr-xWebKit/chromium/src/WebIDBObjectStoreImpl.cpp112
-rwxr-xr-xWebKit/chromium/src/WebIDBObjectStoreImpl.h66
-rw-r--r--WebKit/chromium/src/WebIDBTransactionCallbacksImpl.cpp61
-rw-r--r--WebKit/chromium/src/WebIDBTransactionCallbacksImpl.h56
-rw-r--r--WebKit/chromium/src/WebIDBTransactionImpl.cpp85
-rw-r--r--WebKit/chromium/src/WebIDBTransactionImpl.h60
-rw-r--r--WebKit/chromium/src/WebImageCG.cpp10
-rw-r--r--WebKit/chromium/src/WebImageDecoder.cpp121
-rw-r--r--WebKit/chromium/src/WebInputElement.cpp107
-rw-r--r--WebKit/chromium/src/WebInputEvent.cpp2
-rw-r--r--WebKit/chromium/src/WebInputEventConversion.cpp102
-rw-r--r--WebKit/chromium/src/WebInputEventConversion.h34
-rw-r--r--WebKit/chromium/src/WebKit.cpp12
-rw-r--r--WebKit/chromium/src/WebLabelElement.cpp64
-rw-r--r--WebKit/chromium/src/WebMediaElement.cpp64
-rw-r--r--WebKit/chromium/src/WebMediaPlayerClientImpl.cpp128
-rw-r--r--WebKit/chromium/src/WebMediaPlayerClientImpl.h40
-rw-r--r--WebKit/chromium/src/WebNamedNodeMap.cpp69
-rw-r--r--WebKit/chromium/src/WebNode.cpp105
-rw-r--r--WebKit/chromium/src/WebNotification.cpp37
-rw-r--r--WebKit/chromium/src/WebOptionElement.cpp (renamed from WebKit/chromium/src/AutocompletePopupMenuClient.cpp)70
-rw-r--r--WebKit/chromium/src/WebPageSerializer.cpp13
-rw-r--r--WebKit/chromium/src/WebPageSerializerImpl.cpp159
-rw-r--r--WebKit/chromium/src/WebPageSerializerImpl.h66
-rw-r--r--WebKit/chromium/src/WebPasswordFormData.cpp5
-rw-r--r--WebKit/chromium/src/WebPasswordFormUtils.cpp9
-rw-r--r--WebKit/chromium/src/WebPerformance.cpp160
-rw-r--r--WebKit/chromium/src/WebPluginContainerImpl.cpp209
-rw-r--r--WebKit/chromium/src/WebPluginContainerImpl.h57
-rw-r--r--WebKit/chromium/src/WebPluginDocument.cpp72
-rw-r--r--WebKit/chromium/src/WebPluginListBuilderImpl.cpp22
-rw-r--r--WebKit/chromium/src/WebPluginListBuilderImpl.h4
-rw-r--r--WebKit/chromium/src/WebPluginLoadObserver.h2
-rw-r--r--WebKit/chromium/src/WebPopupMenuImpl.cpp58
-rw-r--r--WebKit/chromium/src/WebPopupMenuImpl.h32
-rw-r--r--WebKit/chromium/src/WebRuntimeFeatures.cpp114
-rw-r--r--WebKit/chromium/src/WebScriptController.cpp14
-rw-r--r--WebKit/chromium/src/WebScrollbarImpl.cpp307
-rw-r--r--WebKit/chromium/src/WebScrollbarImpl.h84
-rw-r--r--WebKit/chromium/src/WebSearchableFormData.cpp38
-rw-r--r--WebKit/chromium/src/WebSecurityOrigin.cpp39
-rw-r--r--WebKit/chromium/src/WebSecurityPolicy.cpp30
-rw-r--r--WebKit/chromium/src/WebSelectElement.cpp80
-rw-r--r--WebKit/chromium/src/WebSerializedScriptValue.cpp82
-rw-r--r--WebKit/chromium/src/WebSettingsImpl.cpp82
-rw-r--r--WebKit/chromium/src/WebSettingsImpl.h21
-rw-r--r--WebKit/chromium/src/WebSharedWorkerImpl.cpp6
-rw-r--r--WebKit/chromium/src/WebSharedWorkerImpl.h2
-rw-r--r--WebKit/chromium/src/WebSpeechInputControllerMockImpl.cpp98
-rw-r--r--WebKit/chromium/src/WebSpeechInputControllerMockImpl.h75
-rw-r--r--WebKit/chromium/src/WebSpeechInputResult.cpp54
-rw-r--r--WebKit/chromium/src/WebStorageAreaImpl.cpp2
-rw-r--r--WebKit/chromium/src/WebStorageAreaImpl.h2
-rw-r--r--WebKit/chromium/src/WebStorageNamespaceImpl.cpp6
-rw-r--r--WebKit/chromium/src/WebString.cpp28
-rw-r--r--WebKit/chromium/src/WebTextRun.cpp45
-rwxr-xr-xWebKit/chromium/src/WebThreadSafeData.cpp75
-rw-r--r--WebKit/chromium/src/WebURLError.cpp2
-rw-r--r--WebKit/chromium/src/WebURLLoadTiming.cpp192
-rw-r--r--WebKit/chromium/src/WebURLRequest.cpp42
-rw-r--r--WebKit/chromium/src/WebURLRequestPrivate.h8
-rw-r--r--WebKit/chromium/src/WebURLResponse.cpp119
-rw-r--r--WebKit/chromium/src/WebURLResponsePrivate.h5
-rw-r--r--WebKit/chromium/src/WebViewImpl.cpp1434
-rw-r--r--WebKit/chromium/src/WebViewImpl.h236
-rw-r--r--WebKit/chromium/src/WebWorkerBase.cpp150
-rw-r--r--WebKit/chromium/src/WebWorkerBase.h42
-rw-r--r--WebKit/chromium/src/WebWorkerClientImpl.cpp42
-rw-r--r--WebKit/chromium/src/WebWorkerClientImpl.h46
-rw-r--r--WebKit/chromium/src/WebWorkerImpl.cpp4
-rw-r--r--WebKit/chromium/src/WebWorkerImpl.h2
-rw-r--r--WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp225
-rw-r--r--WebKit/chromium/src/WorkerAsyncFileSystemChromium.h95
-rw-r--r--WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp89
-rw-r--r--WebKit/chromium/src/WorkerAsyncFileWriterChromium.h88
-rw-r--r--WebKit/chromium/src/WorkerFileSystemCallbacksBridge.cpp392
-rw-r--r--WebKit/chromium/src/WorkerFileSystemCallbacksBridge.h156
-rw-r--r--WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp220
-rw-r--r--WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h165
-rw-r--r--WebKit/chromium/src/WrappedResourceRequest.h4
-rw-r--r--WebKit/chromium/src/WrappedResourceResponse.h4
-rw-r--r--WebKit/chromium/src/gtk/WebFontInfo.cpp86
-rw-r--r--WebKit/chromium/src/gtk/WebInputEventFactory.cpp77
-rw-r--r--WebKit/chromium/src/gtk/WebScreenInfoFactory.cpp62
-rw-r--r--WebKit/chromium/src/js/DebuggerAgent.js1528
-rw-r--r--WebKit/chromium/src/js/DevTools.js448
-rw-r--r--WebKit/chromium/src/js/DevToolsHostStub.js309
-rw-r--r--WebKit/chromium/src/js/HeapProfilerPanel.js966
-rwxr-xr-xWebKit/chromium/src/js/Images/segmentChromium.pngbin4253 -> 4272 bytes
-rwxr-xr-xWebKit/chromium/src/js/Images/statusbarBackgroundChromium.pngbin4070 -> 4116 bytes
-rwxr-xr-xWebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.pngbin4070 -> 4120 bytes
-rwxr-xr-xWebKit/chromium/src/js/Images/statusbarButtonsChromium.pngbin4258 -> 4313 bytes
-rwxr-xr-xWebKit/chromium/src/js/Images/statusbarMenuButtonChromium.pngbin4391 -> 4654 bytes
-rw-r--r--WebKit/chromium/src/js/InjectDispatch.js106
-rw-r--r--WebKit/chromium/src/js/InspectorControllerImpl.js279
-rw-r--r--WebKit/chromium/src/js/ProfilerAgent.js227
-rw-r--r--WebKit/chromium/src/js/ProfilerProcessor.js543
-rw-r--r--WebKit/chromium/src/js/Tests.js1157
-rw-r--r--[-rwxr-xr-x]WebKit/chromium/src/js/devTools.css170
-rw-r--r--WebKit/chromium/src/linux/WebFontRenderStyle.cpp60
-rw-r--r--WebKit/chromium/src/mac/WebInputEventFactory.mm71
-rw-r--r--WebKit/chromium/src/win/WebInputEventFactory.cpp27
264 files changed, 20733 insertions, 12446 deletions
diff --git a/WebKit/chromium/src/ApplicationCacheHost.cpp b/WebKit/chromium/src/ApplicationCacheHost.cpp
index 5fa4a66..a6e66c6 100644
--- a/WebKit/chromium/src/ApplicationCacheHost.cpp
+++ b/WebKit/chromium/src/ApplicationCacheHost.cpp
@@ -37,10 +37,15 @@
#include "DocumentLoader.h"
#include "DOMApplicationCache.h"
#include "Frame.h"
+#include "InspectorApplicationCacheAgent.h"
+#include "InspectorController.h"
+#include "Page.h"
+#include "ProgressEvent.h"
#include "Settings.h"
#include "WebURL.h"
#include "WebURLError.h"
#include "WebURLResponse.h"
+#include "WebVector.h"
#include "WrappedResourceRequest.h"
#include "WrappedResourceResponse.h"
@@ -103,11 +108,16 @@ void ApplicationCacheHost::selectCacheWithManifest(const KURL& manifestURL)
// see WebCore::ApplicationCacheGroup::selectCache()
const KURL& docURL = m_documentLoader->frame()->document()->url();
String referrer = m_documentLoader->frameLoader()->referrer();
- m_documentLoader->frame()->redirectScheduler()->scheduleLocationChange(docURL, referrer);
+ m_documentLoader->frame()->navigationScheduler()->scheduleLocationChange(docURL, referrer);
}
}
}
+void ApplicationCacheHost::maybeLoadMainResourceForRedirect(ResourceRequest&, SubstituteData&)
+{
+ // N/A to the chromium port
+}
+
bool ApplicationCacheHost::maybeLoadFallbackForMainResponse(const ResourceRequest&, const ResourceResponse& response)
{
if (m_internal) {
@@ -195,34 +205,82 @@ void ApplicationCacheHost::setDOMApplicationCache(DOMApplicationCache* domApplic
m_domApplicationCache = domApplicationCache;
}
-void ApplicationCacheHost::notifyDOMApplicationCache(EventID id)
+void ApplicationCacheHost::notifyDOMApplicationCache(EventID id, int total, int done)
{
+#if ENABLE(INSPECTOR)
+ // If host's frame is main frame and inspector frontend is connected, update appcache status.
+ if (id != PROGRESS_EVENT && m_documentLoader->frame()) {
+ Page* page = m_documentLoader->frame()->page();
+ if (page && page->inspectorController()->applicationCacheAgent() && page->mainFrame() == m_documentLoader->frame())
+ page->inspectorController()->applicationCacheAgent()->updateApplicationCacheStatus(status());
+ }
+#endif
+
if (m_defersEvents) {
- m_deferredEvents.append(id);
+ // Event dispatching is deferred until document.onload has fired.
+ m_deferredEvents.append(DeferredEvent(id, total, done));
return;
}
- if (m_domApplicationCache) {
- ExceptionCode ec = 0;
- m_domApplicationCache->dispatchEvent(Event::create(DOMApplicationCache::toEventType(id), false, false), ec);
- ASSERT(!ec);
+ dispatchDOMEvent(id, total, done);
+}
+
+#if ENABLE(INSPECTOR)
+ApplicationCacheHost::CacheInfo ApplicationCacheHost::applicationCacheInfo()
+{
+ if (!m_internal)
+ return CacheInfo(KURL(), 0, 0, 0);
+
+ WebKit::WebApplicationCacheHost::CacheInfo webInfo;
+ m_internal->m_outerHost->getAssociatedCacheInfo(&webInfo);
+ return CacheInfo(webInfo.manifestURL, webInfo.creationTime, webInfo.updateTime, webInfo.totalSize);
+}
+
+void ApplicationCacheHost::fillResourceList(ResourceInfoList* resources)
+{
+ if (!m_internal)
+ return;
+
+ WebKit::WebVector<WebKit::WebApplicationCacheHost::ResourceInfo> webResources;
+ m_internal->m_outerHost->getResourceList(&webResources);
+ for (size_t i = 0; i < webResources.size(); ++i) {
+ resources->append(ResourceInfo(
+ webResources[i].url, webResources[i].isMaster, webResources[i].isManifest, webResources[i].isFallback,
+ webResources[i].isForeign, webResources[i].isExplicit, webResources[i].size));
}
}
+#endif
void ApplicationCacheHost::stopDeferringEvents()
{
RefPtr<DocumentLoader> protect(documentLoader());
for (unsigned i = 0; i < m_deferredEvents.size(); ++i) {
- EventID id = m_deferredEvents[i];
- if (m_domApplicationCache) {
- ExceptionCode ec = 0;
- m_domApplicationCache->dispatchEvent(Event::create(DOMApplicationCache::toEventType(id), false, false), ec);
- ASSERT(!ec);
- }
+ const DeferredEvent& deferred = m_deferredEvents[i];
+ dispatchDOMEvent(deferred.eventID, deferred.progressTotal, deferred.progressDone);
}
m_deferredEvents.clear();
m_defersEvents = false;
}
+void ApplicationCacheHost::stopLoadingInFrame(Frame* frame)
+{
+ // FIXME: Implement this method.
+}
+
+void ApplicationCacheHost::dispatchDOMEvent(EventID id, int total, int done)
+{
+ if (m_domApplicationCache) {
+ const AtomicString& eventType = DOMApplicationCache::toEventType(id);
+ ExceptionCode ec = 0;
+ RefPtr<Event> event;
+ if (id == PROGRESS_EVENT)
+ event = ProgressEvent::create(eventType, true, done, total);
+ else
+ event = Event::create(eventType, false, false);
+ m_domApplicationCache->dispatchEvent(event, ec);
+ ASSERT(!ec);
+ }
+}
+
ApplicationCacheHost::Status ApplicationCacheHost::status() const
{
return m_internal ? static_cast<Status>(m_internal->m_outerHost->status()) : UNCACHED;
diff --git a/WebKit/chromium/src/ApplicationCacheHostInternal.h b/WebKit/chromium/src/ApplicationCacheHostInternal.h
index 3e52c1b..c88420b 100644
--- a/WebKit/chromium/src/ApplicationCacheHostInternal.h
+++ b/WebKit/chromium/src/ApplicationCacheHostInternal.h
@@ -33,9 +33,13 @@
#if ENABLE(OFFLINE_WEB_APPLICATIONS)
+#include "DocumentLoader.h"
#include "WebApplicationCacheHostClient.h"
+#include "WebFrameClient.h"
+#include "WebFrameImpl.h"
#include "WebKit.h"
#include "WebKitClient.h"
+#include "WebURL.h"
namespace WebCore {
@@ -44,12 +48,24 @@ public:
ApplicationCacheHostInternal(ApplicationCacheHost* host)
: m_innerHost(host)
{
- m_outerHost.set(WebKit::webKitClient()->createApplicationCacheHost(this));
+ WebKit::WebFrameImpl* webFrame = WebKit::WebFrameImpl::fromFrame(host->m_documentLoader->frame());
+ ASSERT(webFrame);
+ m_outerHost.set(webFrame->client()->createApplicationCacheHost(webFrame, this));
+ }
+
+ virtual void didChangeCacheAssociation()
+ {
+ // FIXME: Prod the inspector to update it's notion of what cache the page is using.
}
virtual void notifyEventListener(WebKit::WebApplicationCacheHost::EventID eventID)
{
- m_innerHost->notifyDOMApplicationCache(static_cast<ApplicationCacheHost::EventID>(eventID));
+ m_innerHost->notifyDOMApplicationCache(static_cast<ApplicationCacheHost::EventID>(eventID), 0, 0);
+ }
+
+ virtual void notifyProgressEventListener(const WebKit::WebURL&, int progressTotal, int progressDone)
+ {
+ m_innerHost->notifyDOMApplicationCache(ApplicationCacheHost::PROGRESS_EVENT, progressTotal, progressDone);
}
static WebKit::WebApplicationCacheHost* toWebApplicationCacheHost(ApplicationCacheHost* innerHost)
diff --git a/WebKit/chromium/src/AssertMatchingEnums.cpp b/WebKit/chromium/src/AssertMatchingEnums.cpp
index 1d2948f..ceeed8d 100644
--- a/WebKit/chromium/src/AssertMatchingEnums.cpp
+++ b/WebKit/chromium/src/AssertMatchingEnums.cpp
@@ -35,29 +35,59 @@
#include "AccessibilityObject.h"
#include "ApplicationCacheHost.h"
+#include "AsyncFileSystem.h"
#include "EditorInsertAction.h"
+#include "FileError.h"
+#include "FileMetadata.h"
+#include "FontDescription.h"
+#include "FontSmoothingMode.h"
+#include "GeolocationError.h"
+#include "GeolocationPosition.h"
#include "HTMLInputElement.h"
+#include "IDBKey.h"
#include "MediaPlayer.h"
#include "NotificationPresenter.h"
#include "PasteboardPrivate.h"
#include "PlatformCursor.h"
-#include "StringImpl.h"
+#include "Settings.h"
#include "TextAffinity.h"
+#include "UserContentTypes.h"
+#include "UserScriptTypes.h"
+#include "UserStyleSheetTypes.h"
+#include "VideoFrameChromium.h"
#include "WebAccessibilityObject.h"
#include "WebApplicationCacheHost.h"
#include "WebClipboard.h"
#include "WebCursorInfo.h"
#include "WebEditingAction.h"
+#include "WebFileError.h"
+#include "WebFileInfo.h"
+#include "WebFileSystem.h"
+#include "WebFontDescription.h"
+#include "WebGeolocationError.h"
+#include "WebGeolocationPosition.h"
+#include "WebIDBKey.h"
#include "WebInputElement.h"
#include "WebMediaPlayer.h"
#include "WebNotificationPresenter.h"
+#include "WebScrollbar.h"
+#include "WebSettings.h"
#include "WebTextAffinity.h"
#include "WebTextCaseSensitivity.h"
+#include "WebVideoFrame.h"
+#include "WebView.h"
#include <wtf/Assertions.h>
+#include <wtf/text/StringImpl.h>
#define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, webcore_name) \
COMPILE_ASSERT(int(WebKit::webkit_name) == int(WebCore::webcore_name), mismatching_enums)
+// These constants are in WTF, bring them into WebCore so the ASSERT still works for them!
+namespace WebCore {
+ using WTF::TextCaseSensitive;
+ using WTF::TextCaseInsensitive;
+};
+
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleUnknown, UnknownRole);
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleButton, ButtonRole);
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleRadioButton, RadioButtonRole);
@@ -124,6 +154,7 @@ COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleDefinitionListDefinition, Defin
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleAnnotation, AnnotationRole);
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleSliderThumb, SliderThumbRole);
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleIgnored, IgnoredRole);
+COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRolePresentational, PresentationalRole);
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleTab, TabRole);
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleTabList, TabListRole);
COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleTabPanel, TabPanelRole);
@@ -177,6 +208,7 @@ COMPILE_ASSERT_MATCHING_ENUM(WebClipboard::FormatSmartPaste, PasteboardPrivate::
COMPILE_ASSERT_MATCHING_ENUM(WebClipboard::BufferStandard, PasteboardPrivate::StandardBuffer);
COMPILE_ASSERT_MATCHING_ENUM(WebClipboard::BufferSelection, PasteboardPrivate::SelectionBuffer);
+COMPILE_ASSERT_MATCHING_ENUM(WebClipboard::BufferDrag, PasteboardPrivate::DragBuffer);
COMPILE_ASSERT_MATCHING_ENUM(WebCursorInfo::TypePointer, PlatformCursor::TypePointer);
COMPILE_ASSERT_MATCHING_ENUM(WebCursorInfo::TypeCross, PlatformCursor::TypeCross);
@@ -225,30 +257,30 @@ COMPILE_ASSERT_MATCHING_ENUM(WebEditingActionTyped, EditorInsertActionTyped);
COMPILE_ASSERT_MATCHING_ENUM(WebEditingActionPasted, EditorInsertActionPasted);
COMPILE_ASSERT_MATCHING_ENUM(WebEditingActionDropped, EditorInsertActionDropped);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Text, HTMLInputElement::TEXT);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Password, HTMLInputElement::PASSWORD);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::IsIndex, HTMLInputElement::ISINDEX);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::CheckBox, HTMLInputElement::CHECKBOX);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Radio, HTMLInputElement::RADIO);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Submit, HTMLInputElement::SUBMIT);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Reset, HTMLInputElement::RESET);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::File, HTMLInputElement::FILE);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Hidden, HTMLInputElement::HIDDEN);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Image, HTMLInputElement::IMAGE);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Button, HTMLInputElement::BUTTON);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Search, HTMLInputElement::SEARCH);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Range, HTMLInputElement::RANGE);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Email, HTMLInputElement::EMAIL);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Number, HTMLInputElement::NUMBER);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Telephone, HTMLInputElement::TELEPHONE);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::URL, HTMLInputElement::URL);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Color, HTMLInputElement::COLOR);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Date, HTMLInputElement::DATE);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::DateTime, HTMLInputElement::DATETIME);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::DateTimeLocal, HTMLInputElement::DATETIMELOCAL);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Month, HTMLInputElement::MONTH);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Time, HTMLInputElement::TIME);
-COMPILE_ASSERT_MATCHING_ENUM(WebInputElement::Week, HTMLInputElement::WEEK);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyNone, FontDescription::NoFamily);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyStandard, FontDescription::StandardFamily);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilySerif, FontDescription::SerifFamily);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilySansSerif, FontDescription::SansSerifFamily);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyMonospace, FontDescription::MonospaceFamily);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyCursive, FontDescription::CursiveFamily);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::GenericFamilyFantasy, FontDescription::FantasyFamily);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::SmoothingAuto, AutoSmoothing);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::SmoothingNone, NoSmoothing);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::SmoothingGrayscale, Antialiased);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::SmoothingSubpixel, SubpixelAntialiased);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight100, FontWeight100);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight200, FontWeight200);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight300, FontWeight300);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight400, FontWeight400);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight500, FontWeight500);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight600, FontWeight600);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight700, FontWeight700);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight800, FontWeight800);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::Weight900, FontWeight900);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::WeightNormal, FontWeightNormal);
+COMPILE_ASSERT_MATCHING_ENUM(WebFontDescription::WeightBold, FontWeightBold);
COMPILE_ASSERT_MATCHING_ENUM(WebNode::ElementNode, Node::ELEMENT_NODE);
COMPILE_ASSERT_MATCHING_ENUM(WebNode::AttributeNode, Node::ATTRIBUTE_NODE);
@@ -283,6 +315,21 @@ COMPILE_ASSERT_MATCHING_ENUM(WebMediaPlayer::Unknown, MediaPlayer::Unknown);
COMPILE_ASSERT_MATCHING_ENUM(WebMediaPlayer::Download, MediaPlayer::Download);
COMPILE_ASSERT_MATCHING_ENUM(WebMediaPlayer::StoredStream, MediaPlayer::StoredStream);
COMPILE_ASSERT_MATCHING_ENUM(WebMediaPlayer::LiveStream, MediaPlayer::LiveStream);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatInvalid, VideoFrameChromium::Invalid);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGB555, VideoFrameChromium::RGB555);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGB565, VideoFrameChromium::RGB565);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGB24, VideoFrameChromium::RGB24);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGB32, VideoFrameChromium::RGB32);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatRGBA, VideoFrameChromium::RGBA);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatYV12, VideoFrameChromium::YV12);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatYV16, VideoFrameChromium::YV16);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatNV12, VideoFrameChromium::NV12);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatEmpty, VideoFrameChromium::Empty);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::FormatASCII, VideoFrameChromium::ASCII);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::SurfaceTypeSystemMemory, VideoFrameChromium::TypeSystemMemory);
+COMPILE_ASSERT_MATCHING_ENUM(WebVideoFrame::SurfaceTypeTexture, VideoFrameChromium::TypeTexture);
#endif
#if ENABLE(NOTIFICATIONS)
@@ -291,8 +338,57 @@ COMPILE_ASSERT_MATCHING_ENUM(WebNotificationPresenter::PermissionNotAllowed, Not
COMPILE_ASSERT_MATCHING_ENUM(WebNotificationPresenter::PermissionDenied, NotificationPresenter::PermissionDenied);
#endif
+COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::Horizontal, HorizontalScrollbar);
+COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::Vertical, VerticalScrollbar);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::ScrollByLine, ScrollByLine);
+COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::ScrollByPage, ScrollByPage);
+COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::ScrollByDocument, ScrollByDocument);
+COMPILE_ASSERT_MATCHING_ENUM(WebScrollbar::ScrollByPixel, ScrollByPixel);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebSettings::EditingBehaviorMac, EditingMacBehavior);
+COMPILE_ASSERT_MATCHING_ENUM(WebSettings::EditingBehaviorWin, EditingWindowsBehavior);
+COMPILE_ASSERT_MATCHING_ENUM(WebSettings::EditingBehaviorUnix, EditingUnixBehavior);
+
COMPILE_ASSERT_MATCHING_ENUM(WebTextAffinityUpstream, UPSTREAM);
COMPILE_ASSERT_MATCHING_ENUM(WebTextAffinityDownstream, DOWNSTREAM);
COMPILE_ASSERT_MATCHING_ENUM(WebTextCaseSensitive, TextCaseSensitive);
COMPILE_ASSERT_MATCHING_ENUM(WebTextCaseInsensitive, TextCaseInsensitive);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebView::UserScriptInjectAtDocumentStart, InjectAtDocumentStart);
+COMPILE_ASSERT_MATCHING_ENUM(WebView::UserScriptInjectAtDocumentEnd, InjectAtDocumentEnd);
+COMPILE_ASSERT_MATCHING_ENUM(WebView::UserContentInjectInAllFrames, InjectInAllFrames);
+COMPILE_ASSERT_MATCHING_ENUM(WebView::UserContentInjectInTopFrameOnly, InjectInTopFrameOnly);
+COMPILE_ASSERT_MATCHING_ENUM(WebView::UserStyleInjectInExistingDocuments, InjectInExistingDocuments);
+COMPILE_ASSERT_MATCHING_ENUM(WebView::UserStyleInjectInSubsequentDocuments, InjectInSubsequentDocuments);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebIDBKey::NullType, IDBKey::NullType);
+COMPILE_ASSERT_MATCHING_ENUM(WebIDBKey::StringType, IDBKey::StringType);
+COMPILE_ASSERT_MATCHING_ENUM(WebIDBKey::NumberType, IDBKey::NumberType);
+
+#if ENABLE(FILE_SYSTEM)
+COMPILE_ASSERT_MATCHING_ENUM(WebFileSystem::TypeTemporary, AsyncFileSystem::Temporary);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileSystem::TypePersistent, AsyncFileSystem::Persistent);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileInfo::TypeUnknown, FileMetadata::TypeUnknown);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileInfo::TypeFile, FileMetadata::TypeFile);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileInfo::TypeDirectory, FileMetadata::TypeDirectory);
+#endif
+
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorNotFound, FileError::NOT_FOUND_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorSecurity, FileError::SECURITY_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorAbort, FileError::ABORT_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorNotReadable, FileError::NOT_READABLE_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorEncoding, FileError::ENCODING_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorNoModificationAllowed, FileError::NO_MODIFICATION_ALLOWED_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorInvalidState, FileError::INVALID_STATE_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorSyntax, FileError::SYNTAX_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorInvalidModification, FileError::INVALID_MODIFICATION_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorQuotaExceeded, FileError::QUOTA_EXCEEDED_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorTypeMismatch, FileError::TYPE_MISMATCH_ERR);
+COMPILE_ASSERT_MATCHING_ENUM(WebFileErrorPathExists, FileError::PATH_EXISTS_ERR);
+
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+COMPILE_ASSERT_MATCHING_ENUM(WebGeolocationError::ErrorPermissionDenied, GeolocationError::PermissionDenied);
+COMPILE_ASSERT_MATCHING_ENUM(WebGeolocationError::ErrorPositionUnavailable, GeolocationError::PositionUnavailable);
+#endif
diff --git a/WebKit/chromium/src/AssociatedURLLoader.cpp b/WebKit/chromium/src/AssociatedURLLoader.cpp
new file mode 100644
index 0000000..f494a0e
--- /dev/null
+++ b/WebKit/chromium/src/AssociatedURLLoader.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "AssociatedURLLoader.h"
+
+#include "WebApplicationCacheHost.h"
+#include "WebDataSource.h"
+#include "WebFrameImpl.h"
+#include "WebKit.h"
+#include "WebKitClient.h"
+#include "WebURLRequest.h"
+
+namespace WebKit {
+
+AssociatedURLLoader::AssociatedURLLoader(PassRefPtr<WebFrameImpl> frameImpl)
+ : m_frameImpl(frameImpl),
+ m_realLoader(webKitClient()->createURLLoader())
+{
+}
+
+AssociatedURLLoader::~AssociatedURLLoader()
+{
+}
+
+void AssociatedURLLoader::loadSynchronously(const WebURLRequest& request, WebURLResponse& response, WebURLError& error, WebData& data)
+{
+ WebURLRequest requestCopy(request);
+ prepareRequest(requestCopy);
+
+ m_realLoader->loadSynchronously(requestCopy, response, error, data);
+}
+
+void AssociatedURLLoader::loadAsynchronously(const WebURLRequest& request, WebURLLoaderClient* client)
+{
+ WebURLRequest requestCopy(request);
+ prepareRequest(requestCopy);
+
+ m_realLoader->loadAsynchronously(requestCopy, client);
+}
+
+void AssociatedURLLoader::cancel()
+{
+ m_realLoader->cancel();
+}
+
+void AssociatedURLLoader::setDefersLoading(bool defersLoading)
+{
+ m_realLoader->setDefersLoading(defersLoading);
+}
+
+void AssociatedURLLoader::prepareRequest(WebURLRequest& request)
+{
+ WebApplicationCacheHost* applicationCacheHost = m_frameImpl->dataSource()->applicationCacheHost();
+ if (applicationCacheHost)
+ applicationCacheHost->willStartSubResourceRequest(request);
+ m_frameImpl->dispatchWillSendRequest(request);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/AssociatedURLLoader.h b/WebKit/chromium/src/AssociatedURLLoader.h
new file mode 100644
index 0000000..4c9f54e
--- /dev/null
+++ b/WebKit/chromium/src/AssociatedURLLoader.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef AssociatedURLLoader_h
+#define AssociatedURLLoader_h
+
+#include "WebURLLoader.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebKit {
+
+class WebFrameImpl;
+
+// This class is used to implement WebFrame::createAssociatedURLLoader.
+// FIXME: Implement in terms of WebCore::SubresourceLoader.
+class AssociatedURLLoader : public WebURLLoader {
+public:
+ AssociatedURLLoader(PassRefPtr<WebFrameImpl>);
+ ~AssociatedURLLoader();
+
+ // WebURLLoader methods:
+ virtual void loadSynchronously(const WebURLRequest&, WebURLResponse&, WebURLError&, WebData&);
+ virtual void loadAsynchronously(const WebURLRequest&, WebURLLoaderClient*);
+ virtual void cancel();
+ virtual void setDefersLoading(bool);
+
+private:
+ void prepareRequest(WebURLRequest&);
+
+ RefPtr<WebFrameImpl> m_frameImpl;
+ OwnPtr<WebURLLoader> m_realLoader;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/WebKit/chromium/src/AsyncFileSystemChromium.cpp b/WebKit/chromium/src/AsyncFileSystemChromium.cpp
new file mode 100644
index 0000000..5975e72
--- /dev/null
+++ b/WebKit/chromium/src/AsyncFileSystemChromium.cpp
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+#include "config.h"
+#include "AsyncFileSystemChromium.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileSystemCallbacks.h"
+#include "AsyncFileWriterChromium.h"
+#include "WebFileInfo.h"
+#include "WebFileSystem.h"
+#include "WebFileSystemCallbacksImpl.h"
+#include "WebFileWriter.h"
+#include "WebKit.h"
+#include "WebKitClient.h"
+
+#include <wtf/text/CString.h>
+
+namespace WebCore {
+
+bool AsyncFileSystem::isAvailable()
+{
+ return true;
+}
+
+AsyncFileSystemChromium::AsyncFileSystemChromium(const String& rootPath)
+ : AsyncFileSystem(rootPath)
+ , m_webFileSystem(WebKit::webKitClient()->fileSystem())
+{
+ ASSERT(m_webFileSystem);
+}
+
+AsyncFileSystemChromium::~AsyncFileSystemChromium()
+{
+}
+
+void AsyncFileSystemChromium::move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->move(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->copy(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->remove(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->removeRecursively(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->readMetadata(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->createFile(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->createDirectory(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->fileExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->directoryExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+void AsyncFileSystemChromium::readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->readDirectory(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+}
+
+class FileWriterHelperCallbacks : public WebKit::WebFileSystemCallbacks {
+public:
+ FileWriterHelperCallbacks(AsyncFileWriterClient* client, const String& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks)
+ : m_client(client)
+ , m_path(path)
+ , m_webFileSystem(webFileSystem)
+ , m_callbacks(callbacks)
+ {
+ }
+
+ virtual void didSucceed()
+ {
+ ASSERT_NOT_REACHED();
+ delete this;
+ }
+ virtual void didReadMetadata(const WebKit::WebFileInfo& info)
+ {
+ ASSERT(m_callbacks);
+ if (info.type != WebKit::WebFileInfo::TypeFile || info.length < 0)
+ m_callbacks->didFail(WebKit::WebFileErrorInvalidState);
+ else {
+ OwnPtr<AsyncFileWriterChromium> asyncFileWriterChromium = adoptPtr(new AsyncFileWriterChromium(m_client));
+ OwnPtr<WebKit::WebFileWriter> webFileWriter = adoptPtr(m_webFileSystem->createFileWriter(m_path, asyncFileWriterChromium.get()));
+ asyncFileWriterChromium->setWebFileWriter(webFileWriter.release());
+ m_callbacks->didCreateFileWriter(asyncFileWriterChromium.release(), info.length);
+ }
+ delete this;
+ }
+
+ virtual void didReadDirectory(const WebKit::WebVector<WebKit::WebFileSystemEntry>& entries, bool hasMore)
+ {
+ ASSERT_NOT_REACHED();
+ delete this;
+ }
+ virtual void didOpenFileSystem(const WebKit::WebString& name, const WebKit::WebString& rootPath)
+ {
+ ASSERT_NOT_REACHED();
+ delete this;
+ }
+
+ virtual void didFail(WebKit::WebFileError error)
+ {
+ ASSERT(m_callbacks);
+ m_callbacks->didFail(error);
+ delete this;
+ }
+
+private:
+ AsyncFileWriterClient* m_client;
+ String m_path;
+ WebKit::WebFileSystem* m_webFileSystem;
+ OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks;
+};
+
+void AsyncFileSystemChromium::createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ m_webFileSystem->readMetadata(path, new FileWriterHelperCallbacks(client, path, m_webFileSystem, callbacks));
+}
+
+} // namespace WebCore
+
+#endif
diff --git a/WebKit/chromium/src/AsyncFileSystemChromium.h b/WebKit/chromium/src/AsyncFileSystemChromium.h
new file mode 100644
index 0000000..6205609
--- /dev/null
+++ b/WebKit/chromium/src/AsyncFileSystemChromium.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef AsyncFileSystemChromium_h
+#define AsyncFileSystemChromium_h
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileSystem.h"
+#include <wtf/PassOwnPtr.h>
+
+namespace WebKit {
+class WebFileSystem;
+}
+
+namespace WebCore {
+
+class AsyncFileSystemCallbacks;
+
+class AsyncFileSystemChromium : public AsyncFileSystem {
+public:
+ static PassOwnPtr<AsyncFileSystem> create(const String& rootPath)
+ {
+ return adoptPtr(new AsyncFileSystemChromium(rootPath));
+ }
+
+ virtual ~AsyncFileSystemChromium();
+
+ virtual void move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+
+private:
+ explicit AsyncFileSystemChromium(const String& rootPath);
+ WebKit::WebFileSystem* m_webFileSystem;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // AsyncFileSystemChromium_h
diff --git a/WebKit/chromium/src/AsyncFileWriterChromium.cpp b/WebKit/chromium/src/AsyncFileWriterChromium.cpp
new file mode 100644
index 0000000..71cf3b5
--- /dev/null
+++ b/WebKit/chromium/src/AsyncFileWriterChromium.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "AsyncFileWriterChromium.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileWriterClient.h"
+#include "Blob.h"
+#include "WebFileWriter.h"
+#include "WebURL.h"
+
+namespace WebCore {
+
+AsyncFileWriterChromium::AsyncFileWriterChromium(AsyncFileWriterClient* client)
+ : m_client(client)
+{
+}
+
+AsyncFileWriterChromium::~AsyncFileWriterChromium()
+{
+}
+
+void AsyncFileWriterChromium::setWebFileWriter(PassOwnPtr<WebKit::WebFileWriter> writer)
+{
+ m_writer = writer;
+}
+
+void AsyncFileWriterChromium::write(long long position, Blob* data)
+{
+ ASSERT(m_writer);
+ m_writer->write(position, WebKit::WebURL(data->url()));
+}
+
+void AsyncFileWriterChromium::truncate(long long length)
+{
+ ASSERT(m_writer);
+ m_writer->truncate(length);
+}
+
+void AsyncFileWriterChromium::abort()
+{
+ ASSERT(m_writer);
+ m_writer->cancel();
+}
+
+void AsyncFileWriterChromium::didWrite(long long bytes, bool complete)
+{
+ ASSERT(m_writer);
+ m_client->didWrite(bytes, complete);
+}
+
+void AsyncFileWriterChromium::didTruncate()
+{
+ m_client->didTruncate();
+}
+
+void AsyncFileWriterChromium::didFail(WebKit::WebFileError error)
+{
+ m_client->didFail(static_cast<FileError::ErrorCode>(error));
+}
+
+} // namespace
+
+#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebKit/chromium/src/AutocompletePopupMenuClient.h b/WebKit/chromium/src/AsyncFileWriterChromium.h
index 16a3771..71a2f18 100644
--- a/WebKit/chromium/src/AutocompletePopupMenuClient.h
+++ b/WebKit/chromium/src/AsyncFileWriterChromium.h
@@ -28,38 +28,49 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef AutocompletePopupMenuClient_h
-#define AutocompletePopupMenuClient_h
-
-#include "SuggestionsPopupMenuClient.h"
+#ifndef AsyncFileWriterChromium_h
+#define AsyncFileWriterChromium_h
-namespace WebCore {
-class HTMLInputElement;
-}
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileWriter.h"
+#include "WebFileError.h"
+#include "WebFileWriterClient.h"
+#include <wtf/PassOwnPtr.h>
namespace WebKit {
-class WebString;
-template <typename T> class WebVector;
+class WebFileWriter;
+}
-// The Autocomplete suggestions popup menu client, used to display a list of
-// autocomplete suggestions.
-class AutocompletePopupMenuClient : public SuggestionsPopupMenuClient {
+namespace WebCore {
+
+class Blob;
+class AsyncFileWriterClient;
+
+class AsyncFileWriterChromium : public AsyncFileWriter, public WebKit::WebFileWriterClient {
public:
- // SuggestionsPopupMenuClient implementation:
- virtual unsigned getSuggestionsCount() const;
- virtual WebString getSuggestion(unsigned listIndex) const;
- virtual void removeSuggestionAtIndex(unsigned listIndex);
+ AsyncFileWriterChromium(AsyncFileWriterClient* client);
+ ~AsyncFileWriterChromium();
+
+ void setWebFileWriter(PassOwnPtr<WebKit::WebFileWriter> writer);
- void initialize(WebCore::HTMLInputElement*,
- const WebVector<WebString>& suggestions,
- int defaultSuggestionIndex);
+ // FileWriter
+ virtual void write(long long position, Blob* data);
+ virtual void truncate(long long length);
+ virtual void abort();
- void setSuggestions(const WebVector<WebString>&);
+ // WebFileWriterClient
+ virtual void didWrite(long long bytes, bool complete);
+ virtual void didTruncate();
+ virtual void didFail(WebKit::WebFileError);
private:
- Vector<WebCore::String> m_suggestions;
+ OwnPtr<WebKit::WebFileWriter> m_writer;
+ AsyncFileWriterClient* m_client;
};
-} // namespace WebKit
+} // namespace
+
+#endif // ENABLE(FILE_SYSTEM)
-#endif
+#endif // AsyncFileWriterChromium_h
diff --git a/WebKit/chromium/src/AutoFillPopupMenuClient.cpp b/WebKit/chromium/src/AutoFillPopupMenuClient.cpp
index 8e6cab4..32abd6f 100644
--- a/WebKit/chromium/src/AutoFillPopupMenuClient.cpp
+++ b/WebKit/chromium/src/AutoFillPopupMenuClient.cpp
@@ -31,65 +31,362 @@
#include "config.h"
#include "AutoFillPopupMenuClient.h"
+#include "CSSStyleSelector.h"
+#include "CSSValueKeywords.h"
+#include "Chrome.h"
+#include "FrameView.h"
#include "HTMLInputElement.h"
+#include "RenderTheme.h"
+#include "WebNode.h"
#include "WebString.h"
#include "WebVector.h"
+#include "WebViewClient.h"
+#include "WebViewImpl.h"
using namespace WebCore;
namespace WebKit {
+AutoFillPopupMenuClient::AutoFillPopupMenuClient()
+ : m_separatorIndex(-1)
+ , m_selectedIndex(-1)
+ , m_textField(0)
+ , m_AutocompleteModeEnabled(false)
+{
+}
+
+AutoFillPopupMenuClient::~AutoFillPopupMenuClient()
+{
+}
+
unsigned AutoFillPopupMenuClient::getSuggestionsCount() const
{
- return m_names.size();
+ return m_names.size() + ((m_separatorIndex == -1) ? 0 : 1);
}
WebString AutoFillPopupMenuClient::getSuggestion(unsigned listIndex) const
{
- // FIXME: Modify the PopupMenu to add the label in gray right-justified.
- ASSERT(listIndex >= 0 && listIndex < m_names.size());
- return m_names[listIndex] + String(" (") + m_labels[listIndex] + String(")");
+ int index = convertListIndexToInternalIndex(listIndex);
+ if (index == -1)
+ return WebString();
+
+ ASSERT(index >= 0 && static_cast<size_t>(index) < m_names.size());
+ return m_names[index];
+}
+
+WebString AutoFillPopupMenuClient::getLabel(unsigned listIndex) const
+{
+ int index = convertListIndexToInternalIndex(listIndex);
+ if (index == -1)
+ return WebString();
+
+ ASSERT(index >= 0 && static_cast<size_t>(index) < m_labels.size());
+ return m_labels[index];
+}
+
+WebString AutoFillPopupMenuClient::getIcon(unsigned listIndex) const
+{
+ int index = convertListIndexToInternalIndex(listIndex);
+ if (index == -1)
+ return WebString();
+
+ ASSERT(index >= 0 && static_cast<size_t>(index) < m_icons.size());
+ return m_icons[index];
}
void AutoFillPopupMenuClient::removeSuggestionAtIndex(unsigned listIndex)
{
- // FIXME: Do we want to remove AutoFill suggestions?
- ASSERT(listIndex >= 0 && listIndex < m_names.size());
- m_names.remove(listIndex);
- m_labels.remove(listIndex);
+ if (!canRemoveSuggestionAtIndex(listIndex))
+ return;
+
+ int index = convertListIndexToInternalIndex(listIndex);
+
+ ASSERT(static_cast<unsigned>(index) < m_names.size());
+
+ m_names.remove(index);
+ m_labels.remove(index);
+ m_icons.remove(index);
+ m_uniqueIDs.remove(index);
+
+ // Shift the separator index if necessary.
+ if (m_separatorIndex != -1)
+ m_separatorIndex--;
+}
+
+bool AutoFillPopupMenuClient::canRemoveSuggestionAtIndex(unsigned listIndex)
+{
+ // Only allow deletion of items before the separator that have unique id 0
+ // (i.e. are autocomplete rather than autofill items).
+ int index = convertListIndexToInternalIndex(listIndex);
+ return !m_uniqueIDs[index] && (m_separatorIndex == -1 || listIndex < static_cast<unsigned>(m_separatorIndex));
+}
+
+void AutoFillPopupMenuClient::valueChanged(unsigned listIndex, bool fireEvents)
+{
+ // DEPRECATED: Will be removed once AutoFill and Autocomplete merge is
+ // completed.
+ if (m_AutocompleteModeEnabled) {
+ m_textField->setValue(getSuggestion(listIndex));
+
+ WebViewImpl* webView = getWebView();
+ if (!webView)
+ return;
+
+ EditorClientImpl* editor =
+ static_cast<EditorClientImpl*>(webView->page()->editorClient());
+ ASSERT(editor);
+ editor->onAutocompleteSuggestionAccepted(
+ static_cast<HTMLInputElement*>(m_textField.get()));
+ } else {
+ WebViewImpl* webView = getWebView();
+ if (!webView)
+ return;
+
+ if (m_separatorIndex != -1 && listIndex > static_cast<unsigned>(m_separatorIndex))
+ --listIndex;
+
+ ASSERT(listIndex < m_names.size());
+
+ webView->client()->didAcceptAutoFillSuggestion(WebNode(getTextField()),
+ m_names[listIndex],
+ m_labels[listIndex],
+ m_uniqueIDs[listIndex],
+ listIndex);
+ }
+}
+
+void AutoFillPopupMenuClient::selectionChanged(unsigned listIndex, bool fireEvents)
+{
+ WebViewImpl* webView = getWebView();
+ if (!webView)
+ return;
+
+ if (m_separatorIndex != -1 && listIndex > static_cast<unsigned>(m_separatorIndex))
+ --listIndex;
+
+ ASSERT(listIndex < m_names.size());
+
+ webView->client()->didSelectAutoFillSuggestion(WebNode(getTextField()),
+ m_names[listIndex],
+ m_labels[listIndex],
+ m_uniqueIDs[listIndex]);
+}
+
+void AutoFillPopupMenuClient::selectionCleared()
+{
+ WebViewImpl* webView = getWebView();
+ if (webView)
+ webView->client()->didClearAutoFillSelection(WebNode(getTextField()));
+}
+
+String AutoFillPopupMenuClient::itemText(unsigned listIndex) const
+{
+ return getSuggestion(listIndex);
+}
+
+String AutoFillPopupMenuClient::itemLabel(unsigned listIndex) const
+{
+ return getLabel(listIndex);
+}
+
+String AutoFillPopupMenuClient::itemIcon(unsigned listIndex) const
+{
+ return getIcon(listIndex);
+}
+
+bool AutoFillPopupMenuClient::itemIsEnabled(unsigned listIndex) const
+{
+ return !itemIsWarning(listIndex);
+}
+
+PopupMenuStyle AutoFillPopupMenuClient::itemStyle(unsigned listIndex) const
+{
+ return itemIsWarning(listIndex) ? *m_warningStyle : *m_regularStyle;
+}
+
+PopupMenuStyle AutoFillPopupMenuClient::menuStyle() const
+{
+ return *m_regularStyle;
+}
+
+int AutoFillPopupMenuClient::clientPaddingLeft() const
+{
+ // Bug http://crbug.com/7708 seems to indicate the style can be 0.
+ RenderStyle* style = textFieldStyle();
+ if (!style)
+ return 0;
+
+ return RenderTheme::defaultTheme()->popupInternalPaddingLeft(style);
+}
+
+int AutoFillPopupMenuClient::clientPaddingRight() const
+{
+ // Bug http://crbug.com/7708 seems to indicate the style can be 0.
+ RenderStyle* style = textFieldStyle();
+ if (!style)
+ return 0;
+
+ return RenderTheme::defaultTheme()->popupInternalPaddingRight(style);
+}
+
+void AutoFillPopupMenuClient::popupDidHide()
+{
+ WebViewImpl* webView = getWebView();
+ if (!webView)
+ return;
+
+ webView->autoFillPopupDidHide();
+ webView->client()->didClearAutoFillSelection(WebNode(getTextField()));
+}
+
+bool AutoFillPopupMenuClient::itemIsSeparator(unsigned listIndex) const
+{
+ return (m_separatorIndex != -1 && static_cast<unsigned>(m_separatorIndex) == listIndex);
+}
+
+bool AutoFillPopupMenuClient::itemIsWarning(unsigned listIndex) const
+{
+ int index = convertListIndexToInternalIndex(listIndex);
+ if (index == -1)
+ return false;
+
+ ASSERT(index >= 0 && static_cast<size_t>(index) < m_uniqueIDs.size());
+ return m_uniqueIDs[index] < 0;
+}
+
+void AutoFillPopupMenuClient::setTextFromItem(unsigned listIndex)
+{
+ m_textField->setValue(getSuggestion(listIndex));
+}
+
+FontSelector* AutoFillPopupMenuClient::fontSelector() const
+{
+ return m_textField->document()->styleSelector()->fontSelector();
+}
+
+HostWindow* AutoFillPopupMenuClient::hostWindow() const
+{
+ return m_textField->document()->view()->hostWindow();
+}
+
+PassRefPtr<Scrollbar> AutoFillPopupMenuClient::createScrollbar(
+ ScrollbarClient* client,
+ ScrollbarOrientation orientation,
+ ScrollbarControlSize size)
+{
+ return Scrollbar::createNativeScrollbar(client, orientation, size);
}
void AutoFillPopupMenuClient::initialize(
HTMLInputElement* textField,
const WebVector<WebString>& names,
const WebVector<WebString>& labels,
- int defaultSuggestionIndex)
+ const WebVector<WebString>& icons,
+ const WebVector<int>& uniqueIDs,
+ int separatorIndex)
{
ASSERT(names.size() == labels.size());
- ASSERT(defaultSuggestionIndex < static_cast<int>(names.size()));
+ ASSERT(names.size() == icons.size());
+ ASSERT(names.size() == uniqueIDs.size());
+ ASSERT(separatorIndex < static_cast<int>(names.size()));
+
+ m_selectedIndex = -1;
+ m_textField = textField;
// The suggestions must be set before initializing the
- // SuggestionsPopupMenuClient.
- setSuggestions(names, labels);
+ // AutoFillPopupMenuClient.
+ setSuggestions(names, labels, icons, uniqueIDs, separatorIndex);
- SuggestionsPopupMenuClient::initialize(textField, defaultSuggestionIndex);
+ FontDescription regularFontDescription;
+ RenderTheme::defaultTheme()->systemFont(CSSValueWebkitControl,
+ regularFontDescription);
+ RenderStyle* style = m_textField->computedStyle();
+ regularFontDescription.setComputedSize(style->fontDescription().computedSize());
+
+ Font regularFont(regularFontDescription, 0, 0);
+ regularFont.update(textField->document()->styleSelector()->fontSelector());
+ // The direction of text in popup menu is set the same as the direction of
+ // the input element: textField.
+ m_regularStyle.set(new PopupMenuStyle(Color::black, Color::white, regularFont,
+ true, false, Length(WebCore::Fixed),
+ textField->renderer()->style()->direction()));
+
+ FontDescription warningFontDescription = regularFont.fontDescription();
+ warningFontDescription.setItalic(true);
+ Font warningFont(warningFontDescription, regularFont.letterSpacing(), regularFont.wordSpacing());
+ warningFont.update(regularFont.fontSelector());
+ m_warningStyle.set(new PopupMenuStyle(Color::darkGray,
+ m_regularStyle->backgroundColor(),
+ warningFont,
+ m_regularStyle->isVisible(),
+ m_regularStyle->isDisplayNone(),
+ m_regularStyle->textIndent(),
+ m_regularStyle->textDirection()));
}
void AutoFillPopupMenuClient::setSuggestions(const WebVector<WebString>& names,
- const WebVector<WebString>& labels)
+ const WebVector<WebString>& labels,
+ const WebVector<WebString>& icons,
+ const WebVector<int>& uniqueIDs,
+ int separatorIndex)
{
ASSERT(names.size() == labels.size());
+ ASSERT(names.size() == icons.size());
+ ASSERT(names.size() == uniqueIDs.size());
+ ASSERT(separatorIndex < static_cast<int>(names.size()));
m_names.clear();
m_labels.clear();
+ m_icons.clear();
+ m_uniqueIDs.clear();
for (size_t i = 0; i < names.size(); ++i) {
m_names.append(names[i]);
m_labels.append(labels[i]);
+ m_icons.append(icons[i]);
+ m_uniqueIDs.append(uniqueIDs[i]);
}
+ m_separatorIndex = separatorIndex;
+
// Try to preserve selection if possible.
if (getSelectedIndex() >= static_cast<int>(names.size()))
setSelectedIndex(-1);
}
+int AutoFillPopupMenuClient::convertListIndexToInternalIndex(unsigned listIndex) const
+{
+ if (listIndex == static_cast<unsigned>(m_separatorIndex))
+ return -1;
+
+ if (m_separatorIndex == -1 || listIndex < static_cast<unsigned>(m_separatorIndex))
+ return listIndex;
+ return listIndex - 1;
+}
+
+WebViewImpl* AutoFillPopupMenuClient::getWebView() const
+{
+ Frame* frame = m_textField->document()->frame();
+ if (!frame)
+ return 0;
+
+ Page* page = frame->page();
+ if (!page)
+ return 0;
+
+ return static_cast<ChromeClientImpl*>(page->chrome()->client())->webView();
+}
+
+RenderStyle* AutoFillPopupMenuClient::textFieldStyle() const
+{
+ RenderStyle* style = m_textField->computedStyle();
+ if (!style) {
+ // It seems we can only have a 0 style in a TextField if the
+ // node is detached, in which case we the popup should not be
+ // showing. Please report this in http://crbug.com/7708 and
+ // include the page you were visiting.
+ ASSERT_NOT_REACHED();
+ }
+ return style;
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/AutoFillPopupMenuClient.h b/WebKit/chromium/src/AutoFillPopupMenuClient.h
index 1912fa3..e3edfd3 100644
--- a/WebKit/chromium/src/AutoFillPopupMenuClient.h
+++ b/WebKit/chromium/src/AutoFillPopupMenuClient.h
@@ -31,36 +31,126 @@
#ifndef AutoFillPopupMenuClient_h
#define AutoFillPopupMenuClient_h
-#include "SuggestionsPopupMenuClient.h"
+#include "PopupMenuClient.h"
namespace WebCore {
class HTMLInputElement;
+class PopupMenuStyle;
+class RenderStyle;
}
namespace WebKit {
class WebString;
+class WebViewImpl;
template <typename T> class WebVector;
// The AutoFill suggestions popup menu client, used to display name suggestions
// with right-justified labels.
-class AutoFillPopupMenuClient : public SuggestionsPopupMenuClient {
+class AutoFillPopupMenuClient : public WebCore::PopupMenuClient {
public:
- // SuggestionsPopupMenuClient implementation:
+ AutoFillPopupMenuClient();
+ virtual ~AutoFillPopupMenuClient();
+
+ // Returns the number of suggestions available.
virtual unsigned getSuggestionsCount() const;
+
+ // Returns the suggestion at |listIndex|.
virtual WebString getSuggestion(unsigned listIndex) const;
+
+ // Returns the label at |listIndex|.
+ virtual WebString getLabel(unsigned listIndex) const;
+
+ // Returns the icon at |listIndex|.
+ virtual WebString getIcon(unsigned listIndex) const;
+
+ // Removes the suggestion at |listIndex| from the list of suggestions.
virtual void removeSuggestionAtIndex(unsigned listIndex);
+ // Returns true if the suggestion at |listIndex| can be removed.
+ bool canRemoveSuggestionAtIndex(unsigned listIndex);
+
+ // WebCore::PopupMenuClient methods:
+ virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
+ virtual void selectionChanged(unsigned, bool);
+ virtual void selectionCleared();
+ virtual WTF::String itemText(unsigned listIndex) const;
+ virtual WTF::String itemLabel(unsigned listIndex) const;
+ virtual WTF::String itemIcon(unsigned listIndex) const;
+ virtual WTF::String itemToolTip(unsigned lastIndex) const { return WTF::String(); }
+ virtual WTF::String itemAccessibilityText(unsigned lastIndex) const { return WTF::String(); }
+ virtual bool itemIsEnabled(unsigned listIndex) const;
+ virtual WebCore::PopupMenuStyle itemStyle(unsigned listIndex) const;
+ virtual WebCore::PopupMenuStyle menuStyle() const;
+ virtual int clientInsetLeft() const { return 0; }
+ virtual int clientInsetRight() const { return 0; }
+ virtual int clientPaddingLeft() const;
+ virtual int clientPaddingRight() const;
+ virtual int listSize() const { return getSuggestionsCount(); }
+ virtual int selectedIndex() const { return m_selectedIndex; }
+ virtual void popupDidHide();
+ virtual bool itemIsSeparator(unsigned listIndex) const;
+ virtual bool itemIsLabel(unsigned listIndex) const { return false; }
+ virtual bool itemIsSelected(unsigned listIndex) const { return false; }
+ virtual bool shouldPopOver() const { return false; }
+ virtual bool valueShouldChangeOnHotTrack() const { return false; }
+ virtual void setTextFromItem(unsigned listIndex);
+ virtual WebCore::FontSelector* fontSelector() const;
+ virtual WebCore::HostWindow* hostWindow() const;
+ virtual PassRefPtr<WebCore::Scrollbar> createScrollbar(
+ WebCore::ScrollbarClient* client,
+ WebCore::ScrollbarOrientation orientation,
+ WebCore::ScrollbarControlSize size);
+
void initialize(WebCore::HTMLInputElement*,
const WebVector<WebString>& names,
const WebVector<WebString>& labels,
- int defaultSuggestionIndex);
+ const WebVector<WebString>& icons,
+ const WebVector<int>& uniqueIDs,
+ int separatorIndex);
void setSuggestions(const WebVector<WebString>& names,
- const WebVector<WebString>& labels);
+ const WebVector<WebString>& labels,
+ const WebVector<WebString>& icons,
+ const WebVector<int>& uniqueIDs,
+ int separatorIndex);
+
+ // DEPRECATED: Will be removed once Autocomplete and AutoFill merge is
+ // complete.
+ void setAutocompleteMode(bool enabled) { m_AutocompleteModeEnabled = enabled; }
private:
- Vector<WebCore::String> m_names;
- Vector<WebCore::String> m_labels;
+ // Convert the specified index from an index into the visible list (which might
+ // include a separator entry) to an index to |m_names| and |m_labels|.
+ // Returns -1 if the given index points to the separator.
+ int convertListIndexToInternalIndex(unsigned) const;
+ WebViewImpl* getWebView() const;
+ WebCore::HTMLInputElement* getTextField() const { return m_textField.get(); }
+ WebCore::RenderStyle* textFieldStyle() const;
+
+ int getSelectedIndex() const { return m_selectedIndex; }
+ void setSelectedIndex(int index) { m_selectedIndex = index; }
+
+ bool itemIsWarning(unsigned listIndex) const;
+
+ // The names, labels and icons that make up the contents of the menu items.
+ Vector<WTF::String> m_names;
+ Vector<WTF::String> m_labels;
+ Vector<WTF::String> m_icons;
+ Vector<int> m_uniqueIDs;
+
+ // The index of the separator. -1 if there is no separator.
+ int m_separatorIndex;
+
+ // The index of the selected item. -1 if there is no selected item.
+ int m_selectedIndex;
+
+ RefPtr<WebCore::HTMLInputElement> m_textField;
+ OwnPtr<WebCore::PopupMenuStyle> m_regularStyle;
+ OwnPtr<WebCore::PopupMenuStyle> m_warningStyle;
+
+ // DEPRECATED: Will be removed once Autocomplete and AutoFill merge is
+ // complete.
+ bool m_AutocompleteModeEnabled;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/BackForwardListClientImpl.cpp b/WebKit/chromium/src/BackForwardListClientImpl.cpp
index f5b04ab..af659bc 100644
--- a/WebKit/chromium/src/BackForwardListClientImpl.cpp
+++ b/WebKit/chromium/src/BackForwardListClientImpl.cpp
@@ -34,6 +34,7 @@
#include "HistoryItem.h"
#include "WebViewClient.h"
#include "WebViewImpl.h"
+#include <wtf/text/StringConcatenate.h>
using namespace WebCore;
@@ -83,14 +84,15 @@ void BackForwardListClientImpl::goToItem(HistoryItem* item)
m_pendingHistoryItem = 0;
}
-HistoryItem* BackForwardListClientImpl::currentItem()
-{
- return m_currentItem.get();
-}
-
HistoryItem* BackForwardListClientImpl::itemAtIndex(int index)
{
- if (!m_webView->client() || index > forwardListCount() || -index > backListCount())
+ if (!m_webView->client())
+ return 0;
+
+ if (!index)
+ return m_currentItem.get();
+
+ if (index > forwardListCount() || -index > backListCount())
return 0;
// Since we don't keep the entire back/forward list, we have no way to
@@ -102,11 +104,8 @@ HistoryItem* BackForwardListClientImpl::itemAtIndex(int index)
// differently. It should perhaps just ask the FrameLoaderClient to
// perform those navigations.
- String url_string = String::format(
- "%s://go/%d", backForwardNavigationScheme, index);
-
- m_pendingHistoryItem =
- HistoryItem::create(url_string, String(), 0.0);
+ String urlString = makeString(backForwardNavigationScheme, "://go/", String::number(index));
+ m_pendingHistoryItem = HistoryItem::create(urlString, String(), 0);
return m_pendingHistoryItem.get();
}
diff --git a/WebKit/chromium/src/BackForwardListClientImpl.h b/WebKit/chromium/src/BackForwardListClientImpl.h
index 1d8beb0..b795ecf 100644
--- a/WebKit/chromium/src/BackForwardListClientImpl.h
+++ b/WebKit/chromium/src/BackForwardListClientImpl.h
@@ -31,7 +31,7 @@
#ifndef BackForwardListClientImpl_h
#define BackForwardListClientImpl_h
-#include "BackForwardList.h"
+#include "BackForwardListImpl.h"
namespace WebKit {
class WebViewImpl;
@@ -50,7 +50,6 @@ private:
// WebCore::BackForwardListClient methods:
virtual void addItem(PassRefPtr<WebCore::HistoryItem>);
virtual void goToItem(WebCore::HistoryItem*);
- virtual WebCore::HistoryItem* currentItem();
virtual WebCore::HistoryItem* itemAtIndex(int index);
virtual int backListCount();
virtual int forwardListCount();
diff --git a/WebKit/chromium/src/BlobRegistryProxy.cpp b/WebKit/chromium/src/BlobRegistryProxy.cpp
new file mode 100644
index 0000000..84fcb4d
--- /dev/null
+++ b/WebKit/chromium/src/BlobRegistryProxy.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+
+#if ENABLE(BLOB)
+
+#include "BlobRegistryProxy.h"
+
+#include "BlobData.h"
+#include "KURL.h"
+#include "ResourceHandle.h"
+#include "WebBlobData.h"
+#include "WebBlobRegistry.h"
+#include "WebKit.h"
+#include "WebKitClient.h"
+#include "WebURL.h"
+#include <wtf/MainThread.h>
+#include <wtf/StdLibExtras.h>
+
+// We are part of the WebKit implementation.
+using namespace WebKit;
+
+namespace WebCore {
+
+BlobRegistry& blobRegistry()
+{
+ ASSERT(isMainThread());
+ DEFINE_STATIC_LOCAL(BlobRegistryProxy, instance, ());
+ return instance;
+}
+
+BlobRegistryProxy::BlobRegistryProxy()
+ : m_webBlobRegistry(WebKit::webKitClient()->blobRegistry())
+{
+}
+
+void BlobRegistryProxy::registerBlobURL(const KURL& url, PassOwnPtr<BlobData> blobData)
+{
+ if (m_webBlobRegistry) {
+ WebBlobData webBlobData(blobData);
+ m_webBlobRegistry->registerBlobURL(url, webBlobData);
+ }
+}
+
+void BlobRegistryProxy::registerBlobURL(const KURL& url, const KURL& srcURL)
+{
+ if (m_webBlobRegistry)
+ m_webBlobRegistry->registerBlobURL(url, srcURL);
+}
+
+void BlobRegistryProxy::unregisterBlobURL(const KURL& url)
+{
+ if (m_webBlobRegistry)
+ m_webBlobRegistry->unregisterBlobURL(url);
+}
+
+} // namespace WebCore
+
+#endif
diff --git a/WebKit/chromium/src/BlobRegistryProxy.h b/WebKit/chromium/src/BlobRegistryProxy.h
new file mode 100644
index 0000000..6f2ebb2
--- /dev/null
+++ b/WebKit/chromium/src/BlobRegistryProxy.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef BlobRegistryProxy_h
+#define BlobRegistryProxy_h
+
+#if ENABLE(BLOB)
+
+#include "BlobRegistry.h"
+
+namespace WebKit { class WebBlobRegistry; }
+
+namespace WebCore {
+
+class BlobRegistryProxy : public BlobRegistry {
+public:
+ BlobRegistryProxy();
+
+ virtual void registerBlobURL(const KURL&, PassOwnPtr<BlobData>);
+ virtual void registerBlobURL(const KURL&, const KURL& srcURL);
+ virtual void unregisterBlobURL(const KURL&);
+
+ virtual PassRefPtr<ResourceHandle> createResourceHandle(const ResourceRequest&, ResourceHandleClient*) { return 0; }
+ virtual bool loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data) { return false; }
+
+private:
+ virtual ~BlobRegistryProxy() { }
+
+ WebKit::WebBlobRegistry* m_webBlobRegistry;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(BLOB)
+
+#endif // BlobRegistryProxy_h
diff --git a/WebKit/chromium/src/ChromeClientImpl.cpp b/WebKit/chromium/src/ChromeClientImpl.cpp
index ce2f00c..7b67ede 100644
--- a/WebKit/chromium/src/ChromeClientImpl.cpp
+++ b/WebKit/chromium/src/ChromeClientImpl.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -31,25 +32,36 @@
#include "config.h"
#include "ChromeClientImpl.h"
-#include "AccessibilityObject.h"
#include "AXObjectCache.h"
+#include "AccessibilityObject.h"
#include "CharacterNames.h"
#include "Console.h"
#include "Cursor.h"
#include "DatabaseTracker.h"
#include "Document.h"
#include "DocumentLoader.h"
+#include "ExternalPopupMenu.h"
#include "FileChooser.h"
#include "FloatRect.h"
#include "FrameLoadRequest.h"
#include "FrameView.h"
+#include "Geolocation.h"
+#include "GeolocationService.h"
+#include "GeolocationServiceChromium.h"
+#include "GraphicsLayer.h"
+#include "HTMLNames.h"
#include "HitTestResult.h"
#include "IntRect.h"
+#include "NavigationAction.h"
#include "Node.h"
#include "NotificationPresenterImpl.h"
#include "Page.h"
#include "PopupMenuChromium.h"
+#include "RenderWidget.h"
#include "ScriptController.h"
+#include "SearchPopupMenuChromium.h"
+#include "SecurityOrigin.h"
+#include "Settings.h"
#if USE(V8)
#include "V8Proxy.h"
#endif
@@ -59,15 +71,21 @@
#include "WebFileChooserCompletionImpl.h"
#include "WebFrameClient.h"
#include "WebFrameImpl.h"
+#include "WebGeolocationService.h"
#include "WebInputEvent.h"
#include "WebKit.h"
+#include "WebNode.h"
+#include "WebPlugin.h"
+#include "WebPluginContainerImpl.h"
#include "WebPopupMenuImpl.h"
#include "WebPopupMenuInfo.h"
+#include "WebPopupType.h"
#include "WebRect.h"
#include "WebTextDirection.h"
#include "WebURLRequest.h"
#include "WebViewClient.h"
#include "WebViewImpl.h"
+#include "WebWindowFeatures.h"
#include "WindowFeatures.h"
#include "WrappedResourceRequest.h"
@@ -75,6 +93,60 @@ using namespace WebCore;
namespace WebKit {
+// Converts a WebCore::PopupContainerType to a WebKit::WebPopupType.
+static WebPopupType convertPopupType(PopupContainer::PopupType type)
+{
+ switch (type) {
+ case PopupContainer::Select:
+ return WebPopupTypeSelect;
+ case PopupContainer::Suggestion:
+ return WebPopupTypeSuggestion;
+ default:
+ ASSERT_NOT_REACHED();
+ return WebPopupTypeNone;
+ }
+}
+
+// Converts a WebCore::AXObjectCache::AXNotification to a WebKit::WebAccessibilityNotification
+static WebAccessibilityNotification toWebAccessibilityNotification(AXObjectCache::AXNotification notification)
+{
+ switch (notification) {
+ case AXObjectCache::AXActiveDescendantChanged:
+ return WebAccessibilityNotificationActiveDescendantChanged;
+ case AXObjectCache::AXCheckedStateChanged:
+ return WebAccessibilityNotificationCheckedStateChanged;
+ case AXObjectCache::AXChildrenChanged:
+ return WebAccessibilityNotificationChildrenChanged;
+ case AXObjectCache::AXFocusedUIElementChanged:
+ return WebAccessibilityNotificationFocusedUIElementChanged;
+ case AXObjectCache::AXLayoutComplete:
+ return WebAccessibilityNotificationLayoutComplete;
+ case AXObjectCache::AXLoadComplete:
+ return WebAccessibilityNotificationLoadComplete;
+ case AXObjectCache::AXSelectedChildrenChanged:
+ return WebAccessibilityNotificationSelectedChildrenChanged;
+ case AXObjectCache::AXSelectedTextChanged:
+ return WebAccessibilityNotificationSelectedTextChanged;
+ case AXObjectCache::AXValueChanged:
+ return WebAccessibilityNotificationValueChanged;
+ case AXObjectCache::AXScrolledToAnchor:
+ return WebAccessibilityNotificationScrolledToAnchor;
+ case AXObjectCache::AXLiveRegionChanged:
+ return WebAccessibilityNotificationLiveRegionChanged;
+ case AXObjectCache::AXMenuListValueChanged:
+ return WebAccessibilityNotificationMenuListValueChanged;
+ case AXObjectCache::AXRowCountChanged:
+ return WebAccessibilityNotificationRowCountChanged;
+ case AXObjectCache::AXRowCollapsed:
+ return WebAccessibilityNotificationRowCollapsed;
+ case AXObjectCache::AXRowExpanded:
+ return WebAccessibilityNotificationRowExpanded;
+ default:
+ ASSERT_NOT_REACHED();
+ return WebAccessibilityNotificationInvalid;
+ }
+}
+
ChromeClientImpl::ChromeClientImpl(WebViewImpl* webView)
: m_webView(webView)
, m_toolbarsVisible(true)
@@ -82,7 +154,6 @@ ChromeClientImpl::ChromeClientImpl(WebViewImpl* webView)
, m_scrollbarsVisible(true)
, m_menubarVisible(true)
, m_resizable(true)
- , m_ignoreNextSetCursor(false)
{
}
@@ -138,35 +209,8 @@ float ChromeClientImpl::scaleFactor()
void ChromeClientImpl::focus()
{
- if (!m_webView->client())
- return;
-
- m_webView->client()->didFocus();
-
- // If accessibility is enabled, we should notify assistive technology that
- // the active AccessibilityObject changed.
- const Frame* frame = m_webView->focusedWebCoreFrame();
- if (!frame)
- return;
-
- Document* doc = frame->document();
-
- if (doc && doc->axObjectCache()->accessibilityEnabled()) {
- Node* focusedNode = m_webView->focusedWebCoreNode();
-
- if (!focusedNode) {
- // Could not retrieve focused Node.
- return;
- }
-
- // Retrieve the focused AccessibilityObject.
- AccessibilityObject* focusedAccObj =
- doc->axObjectCache()->getOrCreate(focusedNode->renderer());
-
- // Alert assistive technology that focus changed.
- if (focusedAccObj)
- m_webView->client()->focusAccessibilityObject(WebAccessibilityObject(focusedAccObj));
- }
+ if (m_webView->client())
+ m_webView->client()->didFocus();
}
void ChromeClientImpl::unfocus()
@@ -194,27 +238,33 @@ void ChromeClientImpl::takeFocus(FocusDirection direction)
void ChromeClientImpl::focusedNodeChanged(Node* node)
{
- WebURL focus_url;
+ m_webView->client()->focusedNodeChanged(WebNode(node));
+
+ WebURL focusURL;
if (node && node->isLink()) {
// This HitTestResult hack is the easiest way to get a link URL out of a
// WebCore::Node.
- HitTestResult hit_test(IntPoint(0, 0));
+ HitTestResult hitTest(IntPoint(0, 0));
// This cast must be valid because of the isLink() check.
- hit_test.setURLElement(reinterpret_cast<Element*>(node));
- if (hit_test.isLiveLink())
- focus_url = hit_test.absoluteLinkURL();
+ hitTest.setURLElement(static_cast<Element*>(node));
+ if (hitTest.isLiveLink())
+ focusURL = hitTest.absoluteLinkURL();
}
- m_webView->client()->setKeyboardFocusURL(focus_url);
+ m_webView->client()->setKeyboardFocusURL(focusURL);
+}
+
+void ChromeClientImpl::focusedFrameChanged(Frame*)
+{
}
Page* ChromeClientImpl::createWindow(
- Frame* frame, const FrameLoadRequest& r, const WindowFeatures& features)
+ Frame* frame, const FrameLoadRequest& r, const WindowFeatures& features, const NavigationAction&)
{
if (!m_webView->client())
return 0;
WebViewImpl* newView = static_cast<WebViewImpl*>(
- m_webView->client()->createView(WebFrameImpl::fromFrame(frame)));
+ m_webView->client()->createView(WebFrameImpl::fromFrame(frame), features, r.frameName()));
if (!newView)
return 0;
@@ -321,9 +371,9 @@ bool ChromeClientImpl::statusbarVisible()
void ChromeClientImpl::setScrollbarsVisible(bool value)
{
m_scrollbarsVisible = value;
- WebFrameImpl* web_frame = static_cast<WebFrameImpl*>(m_webView->mainFrame());
- if (web_frame)
- web_frame->setAllowsScrolling(value);
+ WebFrameImpl* webFrame = static_cast<WebFrameImpl*>(m_webView->mainFrame());
+ if (webFrame)
+ webFrame->setCanHaveScrollbars(value);
}
bool ChromeClientImpl::scrollbarsVisible()
@@ -462,26 +512,49 @@ IntRect ChromeClientImpl::windowResizerRect() const
return result;
}
-void ChromeClientImpl::repaint(
- const IntRect& paintRect, bool contentChanged, bool immediate,
- bool repaintContentOnly)
+void ChromeClientImpl::invalidateWindow(const IntRect&, bool)
{
- // Ignore spurious calls.
- if (!contentChanged || paintRect.isEmpty())
+ notImplemented();
+}
+
+void ChromeClientImpl::invalidateContentsAndWindow(const IntRect& updateRect, bool /*immediate*/)
+{
+ if (updateRect.isEmpty())
return;
- if (m_webView->client())
- m_webView->client()->didInvalidateRect(paintRect);
+#if USE(ACCELERATED_COMPOSITING)
+ if (!m_webView->isAcceleratedCompositingActive()) {
+#endif
+ if (m_webView->client())
+ m_webView->client()->didInvalidateRect(updateRect);
+#if USE(ACCELERATED_COMPOSITING)
+ } else
+ m_webView->invalidateRootLayerRect(updateRect);
+#endif
+}
+
+void ChromeClientImpl::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate)
+{
+ m_webView->hidePopups();
+ invalidateContentsAndWindow(updateRect, immediate);
}
void ChromeClientImpl::scroll(
const IntSize& scrollDelta, const IntRect& scrollRect,
const IntRect& clipRect)
{
- if (m_webView->client()) {
- int dx = scrollDelta.width();
- int dy = scrollDelta.height();
- m_webView->client()->didScrollRect(dx, dy, clipRect);
- }
+ m_webView->hidePopups();
+#if USE(ACCELERATED_COMPOSITING)
+ if (!m_webView->isAcceleratedCompositingActive()) {
+#endif
+ if (m_webView->client()) {
+ int dx = scrollDelta.width();
+ int dy = scrollDelta.height();
+ m_webView->client()->didScrollRect(dx, dy, clipRect);
+ }
+#if USE(ACCELERATED_COMPOSITING)
+ } else
+ m_webView->scrollRootLayerRect(scrollDelta, clipRect);
+#endif
}
IntPoint ChromeClientImpl::screenToWindow(const IntPoint&) const
@@ -518,11 +591,25 @@ void ChromeClientImpl::mouseDidMoveOverElement(
{
if (!m_webView->client())
return;
+
+ WebURL url;
// Find out if the mouse is over a link, and if so, let our UI know...
if (result.isLiveLink() && !result.absoluteLinkURL().string().isEmpty())
- m_webView->client()->setMouseOverURL(result.absoluteLinkURL());
- else
- m_webView->client()->setMouseOverURL(WebURL());
+ url = result.absoluteLinkURL();
+ else if (result.innerNonSharedNode()
+ && (result.innerNonSharedNode()->hasTagName(HTMLNames::objectTag)
+ || result.innerNonSharedNode()->hasTagName(HTMLNames::embedTag))) {
+ RenderObject* object = result.innerNonSharedNode()->renderer();
+ if (object && object->isWidget()) {
+ Widget* widget = toRenderWidget(object)->widget();
+ if (widget && widget->isPluginContainer()) {
+ WebPluginContainerImpl* plugin = static_cast<WebPluginContainerImpl*>(widget);
+ url = plugin->plugin()->linkAtPosition(result.point());
+ }
+ }
+ }
+
+ m_webView->client()->setMouseOverURL(url);
}
void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir)
@@ -552,6 +639,11 @@ void ChromeClientImpl::reachedMaxAppCacheSize(int64_t spaceNeeded)
{
ASSERT_NOT_REACHED();
}
+
+void ChromeClientImpl::reachedApplicationCacheOriginQuota(SecurityOrigin*)
+{
+ ASSERT_NOT_REACHED();
+}
#endif
void ChromeClientImpl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileChooser)
@@ -562,6 +654,11 @@ void ChromeClientImpl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileCh
WebFileChooserParams params;
params.multiSelect = fileChooser->allowsMultipleFiles();
+#if ENABLE(DIRECTORY_UPLOAD)
+ params.directory = fileChooser->allowsDirectoryUpload();
+#else
+ params.directory = false;
+#endif
params.acceptTypes = fileChooser->acceptTypes();
params.selectedFiles = fileChooser->filenames();
if (params.selectedFiles.size() > 0)
@@ -576,9 +673,13 @@ void ChromeClientImpl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileCh
chooserCompletion->didChooseFile(WebVector<WebString>());
}
+void ChromeClientImpl::chooseIconForFiles(const Vector<WTF::String>&, WebCore::FileChooser*)
+{
+ notImplemented();
+}
+
void ChromeClientImpl::popupOpened(PopupContainer* popupContainer,
const IntRect& bounds,
- bool activatable,
bool handleExternally)
{
if (!m_webView->client())
@@ -589,19 +690,24 @@ void ChromeClientImpl::popupOpened(PopupContainer* popupContainer,
WebPopupMenuInfo popupInfo;
getPopupMenuInfo(popupContainer, &popupInfo);
webwidget = m_webView->client()->createPopupMenu(popupInfo);
- } else
- webwidget = m_webView->client()->createPopupMenu(activatable);
-
+ } else {
+ webwidget = m_webView->client()->createPopupMenu(
+ convertPopupType(popupContainer->popupType()));
+ // We only notify when the WebView has to handle the popup, as when
+ // the popup is handled externally, the fact that a popup is showing is
+ // transparent to the WebView.
+ m_webView->popupOpened(popupContainer);
+ }
static_cast<WebPopupMenuImpl*>(webwidget)->Init(popupContainer, bounds);
}
-void ChromeClientImpl::setCursor(const WebCursorInfo& cursor)
+void ChromeClientImpl::popupClosed(WebCore::PopupContainer* popupContainer)
{
- if (m_ignoreNextSetCursor) {
- m_ignoreNextSetCursor = false;
- return;
- }
+ m_webView->popupClosed(popupContainer);
+}
+void ChromeClientImpl::setCursor(const WebCursorInfo& cursor)
+{
if (m_webView->client())
m_webView->client()->didChangeCursor(cursor);
}
@@ -609,11 +715,6 @@ void ChromeClientImpl::setCursor(const WebCursorInfo& cursor)
void ChromeClientImpl::setCursorForPlugin(const WebCursorInfo& cursor)
{
setCursor(cursor);
-
- // Currently, Widget::setCursor is always called after this function in
- // EventHandler.cpp and since we don't want that we set a flag indicating
- // that the next SetCursor call is to be ignored.
- m_ignoreNextSetCursor = true;
}
void ChromeClientImpl::formStateDidChange(const Node* node)
@@ -655,18 +756,19 @@ void ChromeClientImpl::getPopupMenuInfo(PopupContainer* popupContainer,
}
info->itemHeight = popupContainer->menuItemHeight();
+ info->itemFontSize = popupContainer->menuItemFontSize();
info->selectedIndex = popupContainer->selectedIndex();
info->items.swap(outputItems);
+ info->rightAligned = popupContainer->menuStyle().textDirection() == RTL;
}
-void ChromeClientImpl::didChangeAccessibilityObjectState(AccessibilityObject* obj)
+void ChromeClientImpl::postAccessibilityNotification(AccessibilityObject* obj, AXObjectCache::AXNotification notification)
{
- // Alert assistive technology about the accessibility object state change
+ // Alert assistive technology about the accessibility object notification.
if (obj)
- m_webView->client()->didChangeAccessibilityObjectState(WebAccessibilityObject(obj));
+ m_webView->client()->postAccessibilityNotification(WebAccessibilityObject(obj), toWebAccessibilityNotification(notification));
}
-
#if ENABLE(NOTIFICATIONS)
NotificationPresenter* ChromeClientImpl::notificationPresenter() const
{
@@ -674,4 +776,95 @@ NotificationPresenter* ChromeClientImpl::notificationPresenter() const
}
#endif
+void ChromeClientImpl::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
+{
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+ // FIXME: Implement Client-based Geolocation Permissions
+#else
+ GeolocationServiceChromium* geolocationService = static_cast<GeolocationServiceChromium*>(geolocation->getGeolocationService());
+ geolocationService->geolocationServiceBridge()->attachBridgeIfNeeded();
+ m_webView->client()->geolocationService()->requestPermissionForFrame(geolocationService->geolocationServiceBridge()->getBridgeId(), frame->document()->url());
+#endif
+}
+
+void ChromeClientImpl::cancelGeolocationPermissionRequestForFrame(Frame* frame, Geolocation* geolocation)
+{
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+ // FIXME: Implement Client-based Geolocation Permissions
+#else
+ GeolocationServiceChromium* geolocationService = static_cast<GeolocationServiceChromium*>(geolocation->getGeolocationService());
+ m_webView->client()->geolocationService()->cancelPermissionRequestForFrame(geolocationService->geolocationServiceBridge()->getBridgeId(), frame->document()->url());
+#endif
+}
+
+#if USE(ACCELERATED_COMPOSITING)
+void ChromeClientImpl::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer)
+{
+ m_webView->setRootGraphicsLayer(graphicsLayer ? graphicsLayer->platformLayer() : 0);
+}
+
+void ChromeClientImpl::scheduleCompositingLayerSync()
+{
+ m_webView->setRootLayerNeedsDisplay();
+}
+
+ChromeClient::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const
+{
+ if (!m_webView->allowsAcceleratedCompositing())
+ return 0;
+
+ CompositingTriggerFlags flags = 0;
+ Settings* settings = m_webView->page()->settings();
+ if (settings->acceleratedCompositingFor3DTransformsEnabled())
+ flags |= ThreeDTransformTrigger;
+ if (settings->acceleratedCompositingForVideoEnabled())
+ flags |= VideoTrigger;
+ if (settings->acceleratedCompositingForPluginsEnabled())
+ flags |= PluginTrigger;
+ if (settings->acceleratedCompositingForAnimationEnabled())
+ flags |= AnimationTrigger;
+ if (settings->acceleratedCompositingForCanvasEnabled())
+ flags |= CanvasTrigger;
+
+ return flags;
+}
+#endif
+
+bool ChromeClientImpl::supportsFullscreenForNode(const WebCore::Node* node)
+{
+ if (m_webView->client() && node->hasTagName(WebCore::HTMLNames::videoTag))
+ return m_webView->client()->supportsFullscreen();
+ return false;
+}
+
+void ChromeClientImpl::enterFullscreenForNode(WebCore::Node* node)
+{
+ if (m_webView->client())
+ m_webView->client()->enterFullscreenForNode(WebNode(node));
+}
+
+void ChromeClientImpl::exitFullscreenForNode(WebCore::Node* node)
+{
+ if (m_webView->client())
+ m_webView->client()->exitFullscreenForNode(WebNode(node));
+}
+
+bool ChromeClientImpl::selectItemWritingDirectionIsNatural()
+{
+ return false;
+}
+
+PassRefPtr<PopupMenu> ChromeClientImpl::createPopupMenu(PopupMenuClient* client) const
+{
+ if (WebViewImpl::useExternalPopupMenus())
+ return adoptRef(new ExternalPopupMenu(client, m_webView->client()));
+
+ return adoptRef(new PopupMenuChromium(client));
+}
+
+PassRefPtr<SearchPopupMenu> ChromeClientImpl::createSearchPopupMenu(PopupMenuClient* client) const
+{
+ return adoptRef(new SearchPopupMenuChromium(client));
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/ChromeClientImpl.h b/WebKit/chromium/src/ChromeClientImpl.h
index 9e8c2e3..b024bc0 100644
--- a/WebKit/chromium/src/ChromeClientImpl.h
+++ b/WebKit/chromium/src/ChromeClientImpl.h
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -32,11 +33,15 @@
#define ChromeClientImpl_h
#include "ChromeClientChromium.h"
+#include "PopupMenu.h"
+#include "SearchPopupMenu.h"
namespace WebCore {
class AccessibilityObject;
+class FileChooser;
class HTMLParserQuirks;
class PopupContainer;
+class PopupMenuClient;
class SecurityOrigin;
struct WindowFeatures;
}
@@ -65,8 +70,9 @@ public:
virtual bool canTakeFocus(WebCore::FocusDirection);
virtual void takeFocus(WebCore::FocusDirection);
virtual void focusedNodeChanged(WebCore::Node*);
+ virtual void focusedFrameChanged(WebCore::Frame*);
virtual WebCore::Page* createWindow(
- WebCore::Frame*, const WebCore::FrameLoadRequest&, const WebCore::WindowFeatures&);
+ WebCore::Frame*, const WebCore::FrameLoadRequest&, const WebCore::WindowFeatures&, const WebCore::NavigationAction&);
virtual void show();
virtual bool canRunModal();
virtual void runModal();
@@ -81,24 +87,24 @@ public:
virtual void setResizable(bool);
virtual void addMessageToConsole(
WebCore::MessageSource, WebCore::MessageType, WebCore::MessageLevel,
- const WebCore::String& message, unsigned lineNumber,
- const WebCore::String& sourceID);
+ const WTF::String& message, unsigned lineNumber,
+ const WTF::String& sourceID);
virtual bool canRunBeforeUnloadConfirmPanel();
virtual bool runBeforeUnloadConfirmPanel(
- const WebCore::String& message, WebCore::Frame*);
+ const WTF::String& message, WebCore::Frame*);
virtual void closeWindowSoon();
- virtual void runJavaScriptAlert(WebCore::Frame*, const WebCore::String&);
- virtual bool runJavaScriptConfirm(WebCore::Frame*, const WebCore::String&);
+ virtual void runJavaScriptAlert(WebCore::Frame*, const WTF::String&);
+ virtual bool runJavaScriptConfirm(WebCore::Frame*, const WTF::String&);
virtual bool runJavaScriptPrompt(
- WebCore::Frame*, const WebCore::String& message,
- const WebCore::String& defaultValue, WebCore::String& result);
- virtual void setStatusbarText(const WebCore::String& message);
+ WebCore::Frame*, const WTF::String& message,
+ const WTF::String& defaultValue, WTF::String& result);
+ virtual void setStatusbarText(const WTF::String& message);
virtual bool shouldInterruptJavaScript();
virtual bool tabsToLinks() const;
virtual WebCore::IntRect windowResizerRect() const;
- virtual void repaint(
- const WebCore::IntRect&, bool contentChanged, bool immediate = false,
- bool repaintContentOnly = false);
+ virtual void invalidateWindow(const WebCore::IntRect&, bool);
+ virtual void invalidateContentsAndWindow(const WebCore::IntRect&, bool);
+ virtual void invalidateContentsForSlowScroll(const WebCore::IntRect&, bool);
virtual void scroll(
const WebCore::IntSize& scrollDelta, const WebCore::IntRect& rectToScroll,
const WebCore::IntRect& clipRect);
@@ -111,34 +117,67 @@ public:
virtual void scrollbarsModeDidChange() const;
virtual void mouseDidMoveOverElement(
const WebCore::HitTestResult& result, unsigned modifierFlags);
- virtual void setToolTip(const WebCore::String& tooltipText, WebCore::TextDirection);
+ virtual void setToolTip(const WTF::String& tooltipText, WebCore::TextDirection);
virtual void print(WebCore::Frame*);
virtual void exceededDatabaseQuota(
- WebCore::Frame*, const WebCore::String& databaseName);
+ WebCore::Frame*, const WTF::String& databaseName);
#if ENABLE(OFFLINE_WEB_APPLICATIONS)
virtual void reachedMaxAppCacheSize(int64_t spaceNeeded);
+ virtual void reachedApplicationCacheOriginQuota(WebCore::SecurityOrigin*);
#endif
#if ENABLE(NOTIFICATIONS)
virtual WebCore::NotificationPresenter* notificationPresenter() const;
#endif
- virtual void requestGeolocationPermissionForFrame(
- WebCore::Frame*, WebCore::Geolocation*) { }
+ virtual void requestGeolocationPermissionForFrame(WebCore::Frame*, WebCore::Geolocation*);
+ virtual void cancelGeolocationPermissionRequestForFrame(WebCore::Frame*, WebCore::Geolocation*);
virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
- virtual bool setCursor(WebCore::PlatformCursorHandle) { return false; }
+ virtual void chooseIconForFiles(const Vector<WTF::String>&, WebCore::FileChooser*);
+ virtual void setCursor(const WebCore::Cursor&) { }
virtual void formStateDidChange(const WebCore::Node*);
virtual PassOwnPtr<WebCore::HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
+#if ENABLE(TOUCH_EVENTS)
+ // FIXME: All touch events are forwarded regardless of whether or not they are needed.
+ virtual void needTouchEvents(bool needTouchEvents) { }
+#endif
+
+#if USE(ACCELERATED_COMPOSITING)
+ // Pass 0 as the GraphicsLayer to detatch the root layer.
+ virtual void attachRootGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*);
+
+ // Sets a flag to specify that the next time content is drawn to the window,
+ // the changes appear on the screen in synchrony with updates to GraphicsLayers.
+ virtual void setNeedsOneShotDrawingSynchronization() { }
+
+ // Sets a flag to specify that the view needs to be updated, so we need
+ // to do an eager layout before the drawing.
+ virtual void scheduleCompositingLayerSync();
+
+ virtual CompositingTriggerFlags allowedCompositingTriggers() const;
+#endif
+
+ virtual bool supportsFullscreenForNode(const WebCore::Node*);
+ virtual void enterFullscreenForNode(WebCore::Node*);
+ virtual void exitFullscreenForNode(WebCore::Node*);
// ChromeClientChromium methods:
virtual void popupOpened(WebCore::PopupContainer* popupContainer,
const WebCore::IntRect& bounds,
- bool activatable,
bool handleExternally);
- virtual void didChangeAccessibilityObjectState(WebCore::AccessibilityObject*);
+ virtual void popupClosed(WebCore::PopupContainer* popupContainer);
+ virtual void postAccessibilityNotification(WebCore::AccessibilityObject*, WebCore::AXObjectCache::AXNotification);
// ChromeClientImpl:
void setCursor(const WebCursorInfo& cursor);
void setCursorForPlugin(const WebCursorInfo& cursor);
+ virtual bool selectItemWritingDirectionIsNatural();
+ virtual PassRefPtr<WebCore::PopupMenu> createPopupMenu(WebCore::PopupMenuClient*) const;
+ virtual PassRefPtr<WebCore::SearchPopupMenu> createSearchPopupMenu(WebCore::PopupMenuClient*) const;
+
+#if ENABLE(CONTEXT_MENUS)
+ virtual void showContextMenu() { }
+#endif
+
private:
void getPopupMenuInfo(WebCore::PopupContainer*, WebPopupMenuInfo*);
@@ -148,8 +187,6 @@ private:
bool m_scrollbarsVisible;
bool m_menubarVisible;
bool m_resizable;
- // Set to true if the next SetCursor is to be ignored.
- bool m_ignoreNextSetCursor;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/ChromiumBridge.cpp b/WebKit/chromium/src/ChromiumBridge.cpp
index 0fd0825..e9d1da6 100644
--- a/WebKit/chromium/src/ChromiumBridge.cpp
+++ b/WebKit/chromium/src/ChromiumBridge.cpp
@@ -35,18 +35,25 @@
#include "Chrome.h"
#include "ChromeClientImpl.h"
+#include "WebAudioBus.h"
#include "WebClipboard.h"
#include "WebCookie.h"
+#include "WebCookieJar.h"
#include "WebCursorInfo.h"
#include "WebData.h"
+#include "WebDragData.h"
+#include "WebFileUtilities.h"
#include "WebFrameClient.h"
#include "WebFrameImpl.h"
+#include "WebIDBKey.h"
#include "WebImage.h"
#include "WebKit.h"
#include "WebKitClient.h"
#include "WebMimeRegistry.h"
#include "WebPluginContainerImpl.h"
#include "WebPluginListBuilderImpl.h"
+#include "WebSandboxSupport.h"
+#include "WebSerializedScriptValue.h"
#include "WebScreenInfo.h"
#include "WebString.h"
#include "WebURL.h"
@@ -57,13 +64,13 @@
#if OS(WINDOWS)
#include "WebRect.h"
-#include "WebSandboxSupport.h"
-#include "WebThemeEngine.h"
+#include "win/WebThemeEngine.h"
#endif
-#if OS(LINUX)
-#include "WebSandboxSupport.h"
+#if OS(LINUX) || OS(FREEBSD)
+#include "linux/WebThemeEngine.h"
#include "WebFontInfo.h"
+#include "WebFontRenderStyle.h"
#endif
#if WEBKIT_USING_SKIA
@@ -74,10 +81,17 @@
#include "Cookie.h"
#include "FrameView.h"
#include "GraphicsContext.h"
+#include "IDBFactoryBackendProxy.h"
#include "KURL.h"
#include "NotImplemented.h"
#include "PlatformContextSkia.h"
#include "PluginData.h"
+#include "SharedBuffer.h"
+
+#if !ENABLE(CLIENT_BASED_GEOLOCATION)
+#include "WebGeolocationServiceBridgeImpl.h"
+#endif
+
#include "Worker.h"
#include "WorkerContextProxy.h"
#include <wtf/Assertions.h>
@@ -89,6 +103,9 @@ namespace WebCore {
static ChromeClientImpl* toChromeClientImpl(Widget* widget)
{
+ if (!widget)
+ return 0;
+
FrameView* view;
if (widget->isFrameView())
view = static_cast<FrameView*>(widget);
@@ -112,6 +129,24 @@ static WebWidgetClient* toWebWidgetClient(Widget* widget)
return chromeClientImpl->webView()->client();
}
+static WebCookieJar* getCookieJar(const Document* document)
+{
+ WebFrameImpl* frameImpl = WebFrameImpl::fromFrame(document->frame());
+ if (!frameImpl || !frameImpl->client())
+ return 0;
+ WebCookieJar* cookieJar = frameImpl->client()->cookieJar();
+ if (!cookieJar)
+ cookieJar = webKitClient()->cookieJar();
+ return cookieJar;
+}
+
+// Cache ----------------------------------------------------------------------
+
+void ChromiumBridge::cacheMetadata(const KURL& url, double responseTime, const Vector<char>& data)
+{
+ webKitClient()->cacheMetadata(url, responseTime, data.data(), data.size());
+}
+
// Clipboard ------------------------------------------------------------------
bool ChromiumBridge::clipboardIsFormatAvailable(
@@ -171,27 +206,85 @@ void ChromiumBridge::clipboardWriteImage(NativeImagePtr image,
webKitClient()->clipboard()->writeImage(webImage, sourceURL, title);
}
+void ChromiumBridge::clipboardWriteData(const String& type,
+ const String& data,
+ const String& metadata)
+{
+ webKitClient()->clipboard()->writeData(type, data, metadata);
+}
+
+HashSet<String> ChromiumBridge::clipboardReadAvailableTypes(
+ PasteboardPrivate::ClipboardBuffer buffer, bool* containsFilenames)
+{
+ WebVector<WebString> result = webKitClient()->clipboard()->readAvailableTypes(
+ static_cast<WebClipboard::Buffer>(buffer), containsFilenames);
+ HashSet<String> types;
+ for (size_t i = 0; i < result.size(); ++i)
+ types.add(result[i]);
+ return types;
+}
+
+bool ChromiumBridge::clipboardReadData(PasteboardPrivate::ClipboardBuffer buffer,
+ const String& type, String& data, String& metadata)
+{
+ WebString resultData;
+ WebString resultMetadata;
+ bool succeeded = webKitClient()->clipboard()->readData(
+ static_cast<WebClipboard::Buffer>(buffer), type, &resultData, &resultMetadata);
+ if (succeeded) {
+ data = resultData;
+ metadata = resultMetadata;
+ }
+ return succeeded;
+}
+
+Vector<String> ChromiumBridge::clipboardReadFilenames(PasteboardPrivate::ClipboardBuffer buffer)
+{
+ WebVector<WebString> result = webKitClient()->clipboard()->readFilenames(
+ static_cast<WebClipboard::Buffer>(buffer));
+ Vector<String> convertedResult;
+ for (size_t i = 0; i < result.size(); ++i)
+ convertedResult.append(result[i]);
+ return convertedResult;
+}
+
// Cookies --------------------------------------------------------------------
-void ChromiumBridge::setCookies(const KURL& url,
- const KURL& firstPartyForCookies,
- const String& cookie)
+void ChromiumBridge::setCookies(const Document* document, const KURL& url,
+ const String& value)
{
- webKitClient()->setCookies(url, firstPartyForCookies, cookie);
+ WebCookieJar* cookieJar = getCookieJar(document);
+ if (cookieJar)
+ cookieJar->setCookie(url, document->firstPartyForCookies(), value);
}
-String ChromiumBridge::cookies(const KURL& url,
- const KURL& firstPartyForCookies)
+String ChromiumBridge::cookies(const Document* document, const KURL& url)
{
- return webKitClient()->cookies(url, firstPartyForCookies);
+ String result;
+ WebCookieJar* cookieJar = getCookieJar(document);
+ if (cookieJar)
+ result = cookieJar->cookies(url, document->firstPartyForCookies());
+ return result;
}
-bool ChromiumBridge::rawCookies(const KURL& url, const KURL& firstPartyForCookies, Vector<Cookie>* rawCookies)
+String ChromiumBridge::cookieRequestHeaderFieldValue(const Document* document,
+ const KURL& url)
{
- rawCookies->clear();
+ String result;
+ WebCookieJar* cookieJar = getCookieJar(document);
+ if (cookieJar)
+ result = cookieJar->cookieRequestHeaderFieldValue(url, document->firstPartyForCookies());
+ return result;
+}
+
+bool ChromiumBridge::rawCookies(const Document* document, const KURL& url, Vector<Cookie>& rawCookies)
+{
+ rawCookies.clear();
WebVector<WebCookie> webCookies;
- if (!webKitClient()->rawCookies(url, firstPartyForCookies, &webCookies))
- return false;
+
+ WebCookieJar* cookieJar = getCookieJar(document);
+ if (cookieJar)
+ cookieJar->rawCookies(url, document->firstPartyForCookies(), webCookies);
for (unsigned i = 0; i < webCookies.size(); ++i) {
const WebCookie& webCookie = webCookies[i];
@@ -203,20 +296,25 @@ bool ChromiumBridge::rawCookies(const KURL& url, const KURL& firstPartyForCookie
webCookie.httpOnly,
webCookie.secure,
webCookie.session);
- rawCookies->append(cookie);
+ rawCookies.append(cookie);
}
return true;
}
-void ChromiumBridge::deleteCookie(const KURL& url, const String& cookieName)
+void ChromiumBridge::deleteCookie(const Document* document, const KURL& url, const String& cookieName)
{
- webKitClient()->deleteCookie(url, cookieName);
+ WebCookieJar* cookieJar = getCookieJar(document);
+ if (cookieJar)
+ cookieJar->deleteCookie(url, cookieName);
}
-bool ChromiumBridge::cookiesEnabled(const KURL& url,
- const KURL& firstPartyForCookies)
+bool ChromiumBridge::cookiesEnabled(const Document* document)
{
- return webKitClient()->cookiesEnabled(url, firstPartyForCookies);
+ bool result = false;
+ WebCookieJar* cookieJar = getCookieJar(document);
+ if (cookieJar)
+ result = cookieJar->cookiesEnabled(document->cookieURL(), document->firstPartyForCookies());
+ return result;
}
// DNS ------------------------------------------------------------------------
@@ -230,57 +328,96 @@ void ChromiumBridge::prefetchDNS(const String& hostname)
bool ChromiumBridge::fileExists(const String& path)
{
- return webKitClient()->fileExists(path);
+ return webKitClient()->fileUtilities()->fileExists(path);
}
bool ChromiumBridge::deleteFile(const String& path)
{
- return webKitClient()->deleteFile(path);
+ return webKitClient()->fileUtilities()->deleteFile(path);
}
bool ChromiumBridge::deleteEmptyDirectory(const String& path)
{
- return webKitClient()->deleteEmptyDirectory(path);
+ return webKitClient()->fileUtilities()->deleteEmptyDirectory(path);
}
bool ChromiumBridge::getFileSize(const String& path, long long& result)
{
- return webKitClient()->getFileSize(path, result);
+ return webKitClient()->fileUtilities()->getFileSize(path, result);
+}
+
+void ChromiumBridge::revealFolderInOS(const String& path)
+{
+ webKitClient()->fileUtilities()->revealFolderInOS(path);
}
bool ChromiumBridge::getFileModificationTime(const String& path, time_t& result)
{
- return webKitClient()->getFileModificationTime(path, result);
+ double modificationTime;
+ if (!webKitClient()->fileUtilities()->getFileModificationTime(path, modificationTime))
+ return false;
+ result = static_cast<time_t>(modificationTime);
+ return true;
}
String ChromiumBridge::directoryName(const String& path)
{
- return webKitClient()->directoryName(path);
+ return webKitClient()->fileUtilities()->directoryName(path);
}
String ChromiumBridge::pathByAppendingComponent(const String& path, const String& component)
{
- return webKitClient()->pathByAppendingComponent(path, component);
+ return webKitClient()->fileUtilities()->pathByAppendingComponent(path, component);
}
bool ChromiumBridge::makeAllDirectories(const String& path)
{
- return webKitClient()->makeAllDirectories(path);
+ return webKitClient()->fileUtilities()->makeAllDirectories(path);
}
String ChromiumBridge::getAbsolutePath(const String& path)
{
- return webKitClient()->getAbsolutePath(path);
+ return webKitClient()->fileUtilities()->getAbsolutePath(path);
}
bool ChromiumBridge::isDirectory(const String& path)
{
- return webKitClient()->isDirectory(path);
+ return webKitClient()->fileUtilities()->isDirectory(path);
}
KURL ChromiumBridge::filePathToURL(const String& path)
{
- return webKitClient()->filePathToURL(path);
+ return webKitClient()->fileUtilities()->filePathToURL(path);
+}
+
+PlatformFileHandle ChromiumBridge::openFile(const String& path, FileOpenMode mode)
+{
+ return webKitClient()->fileUtilities()->openFile(path, mode);
+}
+
+void ChromiumBridge::closeFile(PlatformFileHandle& handle)
+{
+ webKitClient()->fileUtilities()->closeFile(handle);
+}
+
+long long ChromiumBridge::seekFile(PlatformFileHandle handle, long long offset, FileSeekOrigin origin)
+{
+ return webKitClient()->fileUtilities()->seekFile(handle, offset, origin);
+}
+
+bool ChromiumBridge::truncateFile(PlatformFileHandle handle, long long offset)
+{
+ return webKitClient()->fileUtilities()->truncateFile(handle, offset);
+}
+
+int ChromiumBridge::readFromFile(PlatformFileHandle handle, char* data, int length)
+{
+ return webKitClient()->fileUtilities()->readFromFile(handle, data, length);
+}
+
+int ChromiumBridge::writeToFile(PlatformFileHandle handle, const char* data, int length)
+{
+ return webKitClient()->fileUtilities()->writeToFile(handle, data, length);
}
// Font -----------------------------------------------------------------------
@@ -296,7 +433,7 @@ bool ChromiumBridge::ensureFontLoaded(HFONT font)
}
#endif
-#if OS(LINUX)
+#if OS(LINUX) || OS(FREEBSD)
String ChromiumBridge::getFontFamilyForCharacters(const UChar* characters, size_t numCharacters)
{
if (webKitClient()->sandboxSupport())
@@ -308,14 +445,50 @@ String ChromiumBridge::getFontFamilyForCharacters(const UChar* characters, size_
return WebString();
}
+
+void ChromiumBridge::getRenderStyleForStrike(const char* font, int sizeAndStyle, FontRenderStyle* result)
+{
+ WebFontRenderStyle style;
+
+ if (webKitClient()->sandboxSupport())
+ webKitClient()->sandboxSupport()->getRenderStyleForStrike(font, sizeAndStyle, &style);
+ else
+ WebFontInfo::renderStyleForStrike(font, sizeAndStyle, &style);
+
+ style.toFontRenderStyle(result);
+}
+#endif
+
+#if OS(DARWIN)
+bool ChromiumBridge::loadFont(NSFont* srcFont, ATSFontContainerRef* out)
+{
+ WebSandboxSupport* ss = webKitClient()->sandboxSupport();
+ if (ss)
+ return ss->loadFont(srcFont, out);
+
+ // This function should only be called in response to an error loading a
+ // font due to being blocked by the sandbox.
+ // This by definition shouldn't happen if there is no sandbox support.
+ ASSERT_NOT_REACHED();
+ *out = 0;
+ return false;
+}
#endif
-// HTML5 DB -------------------------------------------------------------------
+#if !ENABLE(CLIENT_BASED_GEOLOCATION)
+// Geolocation ----------------------------------------------------------------
-#if ENABLE(DATABASE)
-PlatformFileHandle ChromiumBridge::databaseOpenFile(const String& vfsFileName, int desiredFlags, PlatformFileHandle* dirHandle)
+GeolocationServiceBridge* ChromiumBridge::createGeolocationServiceBridge(GeolocationServiceChromium* geolocationServiceChromium)
{
- return webKitClient()->databaseOpenFile(WebString(vfsFileName), desiredFlags, dirHandle);
+ return createGeolocationServiceBridgeImpl(geolocationServiceChromium);
+}
+#endif
+
+// Databases ------------------------------------------------------------------
+
+PlatformFileHandle ChromiumBridge::databaseOpenFile(const String& vfsFileName, int desiredFlags)
+{
+ return webKitClient()->databaseOpenFile(WebString(vfsFileName), desiredFlags);
}
int ChromiumBridge::databaseDeleteFile(const String& vfsFileName, bool syncDir)
@@ -332,7 +505,33 @@ long long ChromiumBridge::databaseGetFileSize(const String& vfsFileName)
{
return webKitClient()->databaseGetFileSize(WebString(vfsFileName));
}
-#endif
+
+// Indexed Database -----------------------------------------------------------
+
+PassRefPtr<IDBFactoryBackendInterface> ChromiumBridge::idbFactory()
+{
+ // There's no reason why we need to allocate a new proxy each time, but
+ // there's also no strong reason not to.
+ return IDBFactoryBackendProxy::create();
+}
+
+void ChromiumBridge::idbShutdown()
+{
+ // In the browser process, this shuts down the utility process. In the renderer process, it does nothing.
+ webKitClient()->idbShutdown();
+}
+
+void ChromiumBridge::createIDBKeysFromSerializedValuesAndKeyPath(const Vector<RefPtr<SerializedScriptValue> >& values, const String& keyPath, Vector<RefPtr<IDBKey> >& keys)
+{
+ WebVector<WebSerializedScriptValue> webValues = values;
+ WebVector<WebIDBKey> webKeys;
+ webKitClient()->createIDBKeysFromSerializedValuesAndKeyPath(webValues, WebString(keyPath), webKeys);
+
+ size_t webKeysSize = webKeys.size();
+ keys.reserveCapacity(webKeysSize);
+ for (size_t i = 0; i < webKeysSize; ++i)
+ keys.append(PassRefPtr<IDBKey>(webKeys[i]));
+}
// Keygen ---------------------------------------------------------------------
@@ -395,7 +594,7 @@ String ChromiumBridge::preferredExtensionForMIMEType(const String& mimeType)
// Plugin ---------------------------------------------------------------------
-bool ChromiumBridge::plugins(bool refresh, Vector<PluginInfo*>* results)
+bool ChromiumBridge::plugins(bool refresh, Vector<PluginInfo>* results)
{
WebPluginListBuilderImpl builder(results);
webKitClient()->getPluginList(refresh, &builder);
@@ -404,14 +603,9 @@ bool ChromiumBridge::plugins(bool refresh, Vector<PluginInfo*>* results)
NPObject* ChromiumBridge::pluginScriptableObject(Widget* widget)
{
- if (!widget)
+ if (!widget || !widget->isPluginContainer())
return 0;
- ASSERT(!widget->isFrameView());
-
- // NOTE: We have to trust that the widget passed to us here is a
- // WebPluginContainerImpl. There isn't a way to dynamically verify it,
- // since the derived class (Widget) has no identifier.
return static_cast<WebPluginContainerImpl*>(widget)->scriptableObject();
}
@@ -428,6 +622,27 @@ PassRefPtr<Image> ChromiumBridge::loadPlatformImageResource(const char* name)
return image;
}
+#if ENABLE(WEB_AUDIO)
+
+PassOwnPtr<AudioBus> ChromiumBridge::loadPlatformAudioResource(const char* name, double sampleRate)
+{
+ const WebData& resource = webKitClient()->loadResource(name);
+ if (resource.isEmpty())
+ return 0;
+
+ return decodeAudioFileData(resource.data(), resource.size(), sampleRate);
+}
+
+PassOwnPtr<AudioBus> ChromiumBridge::decodeAudioFileData(const char* data, size_t size, double sampleRate)
+{
+ WebAudioBus webAudioBus;
+ if (webKitClient()->decodeAudioFileData(&webAudioBus, data, size, sampleRate))
+ return webAudioBus.release();
+ return 0;
+}
+
+#endif // ENABLE(WEB_AUDIO)
+
// Sandbox --------------------------------------------------------------------
bool ChromiumBridge::sandboxEnabled()
@@ -464,6 +679,16 @@ void ChromiumBridge::incrementStatsCounter(const char* name)
webKitClient()->incrementStatsCounter(name);
}
+void ChromiumBridge::histogramCustomCounts(const char* name, int sample, int min, int max, int bucketCount)
+{
+ webKitClient()->histogramCustomCounts(name, sample, min, max, bucketCount);
+}
+
+void ChromiumBridge::histogramEnumeration(const char* name, int sample, int boundaryValue)
+{
+ webKitClient()->histogramEnumeration(name, sample, boundaryValue);
+}
+
// Sudden Termination ---------------------------------------------------------
void ChromiumBridge::suddenTerminationChanged(bool enabled)
@@ -523,6 +748,14 @@ void ChromiumBridge::paintScrollbarTrack(
alignRect);
}
+void ChromiumBridge::paintSpinButton(
+ GraphicsContext* gc, int part, int state, int classicState,
+ const IntRect& rect)
+{
+ webKitClient()->themeEngine()->paintSpinButton(
+ gc->platformContext()->canvas(), part, state, classicState, rect);
+}
+
void ChromiumBridge::paintTextField(
GraphicsContext* gc, int part, int state, int classicState,
const IntRect& rect, const Color& color, bool fillContentArea,
@@ -544,6 +777,67 @@ void ChromiumBridge::paintTrackbar(
gc->platformContext()->canvas(), part, state, classicState, rect);
}
+void ChromiumBridge::paintProgressBar(
+ GraphicsContext* gc, const IntRect& barRect, const IntRect& valueRect, bool determinate, double animatedSeconds)
+{
+ webKitClient()->themeEngine()->paintProgressBar(
+ gc->platformContext()->canvas(), barRect, valueRect, determinate, animatedSeconds);
+}
+
+#elif OS(LINUX)
+
+static WebThemeEngine::Part WebThemePart(ChromiumBridge::ThemePart part)
+{
+ switch (part) {
+ case ChromiumBridge::PartScrollbarDownArrow: return WebThemeEngine::PartScrollbarDownArrow;
+ case ChromiumBridge::PartScrollbarLeftArrow: return WebThemeEngine::PartScrollbarLeftArrow;
+ case ChromiumBridge::PartScrollbarRightArrow: return WebThemeEngine::PartScrollbarRightArrow;
+ case ChromiumBridge::PartScrollbarUpArrow: return WebThemeEngine::PartScrollbarUpArrow;
+ case ChromiumBridge::PartScrollbarHorizontalThumb: return WebThemeEngine::PartScrollbarHorizontalThumb;
+ case ChromiumBridge::PartScrollbarVerticalThumb: return WebThemeEngine::PartScrollbarVerticalThumb;
+ case ChromiumBridge::PartScrollbarHoriztonalTrack: return WebThemeEngine::PartScrollbarHoriztonalTrack;
+ case ChromiumBridge::PartScrollbarVerticalTrack: return WebThemeEngine::PartScrollbarVerticalTrack;
+ }
+ ASSERT_NOT_REACHED();
+ return WebThemeEngine::PartScrollbarDownArrow;
+}
+
+static WebThemeEngine::State WebThemeState(ChromiumBridge::ThemePaintState state)
+{
+ switch (state) {
+ case ChromiumBridge::StateDisabled: return WebThemeEngine::StateDisabled;
+ case ChromiumBridge::StateHover: return WebThemeEngine::StateHover;
+ case ChromiumBridge::StateNormal: return WebThemeEngine::StateNormal;
+ case ChromiumBridge::StatePressed: return WebThemeEngine::StatePressed;
+ }
+ ASSERT_NOT_REACHED();
+ return WebThemeEngine::StateDisabled;
+}
+
+static void GetWebThemeExtraParams(ChromiumBridge::ThemePart part, ChromiumBridge::ThemePaintState state, const ChromiumBridge::ThemePaintExtraParams* extraParams, WebThemeEngine::ExtraParams* webThemeExtraParams)
+{
+ if (part == ChromiumBridge::PartScrollbarHoriztonalTrack || part == ChromiumBridge::PartScrollbarVerticalTrack) {
+ webThemeExtraParams->scrollbarTrack.trackX = extraParams->scrollbarTrack.trackX;
+ webThemeExtraParams->scrollbarTrack.trackY = extraParams->scrollbarTrack.trackY;
+ webThemeExtraParams->scrollbarTrack.trackWidth = extraParams->scrollbarTrack.trackWidth;
+ webThemeExtraParams->scrollbarTrack.trackHeight = extraParams->scrollbarTrack.trackHeight;
+ }
+}
+
+IntSize ChromiumBridge::getThemePartSize(ThemePart part)
+{
+ return webKitClient()->themeEngine()->getSize(WebThemePart(part));
+}
+
+void ChromiumBridge::paintThemePart(
+ GraphicsContext* gc, ThemePart part, ThemePaintState state, const IntRect& rect, const ThemePaintExtraParams* extraParams)
+{
+ WebThemeEngine::ExtraParams webThemeExtraParams;
+ GetWebThemeExtraParams(part, state, extraParams, &webThemeExtraParams);
+ webKitClient()->themeEngine()->paint(
+ gc->platformContext()->canvas(), WebThemePart(part), WebThemeState(state), rect, &webThemeExtraParams);
+}
+
#endif
// Trace Event ----------------------------------------------------------------
@@ -628,6 +922,11 @@ int ChromiumBridge::memoryUsageMB()
return static_cast<int>(webKitClient()->memoryUsageMB());
}
+int ChromiumBridge::actualMemoryUsageMB()
+{
+ return static_cast<int>(webKitClient()->actualMemoryUsageMB());
+}
+
int ChromiumBridge::screenDepth(Widget* widget)
{
WebWidgetClient* client = toWebWidgetClient(widget);
@@ -681,13 +980,6 @@ void ChromiumBridge::widgetSetCursor(Widget* widget, const Cursor& cursor)
client->setCursor(WebCursorInfo(cursor));
}
-void ChromiumBridge::widgetSetFocus(Widget* widget)
-{
- ChromeClientImpl* client = toChromeClientImpl(widget);
- if (client)
- client->focus();
-}
-
WorkerContextProxy* WorkerContextProxy::create(Worker* worker)
{
return WebWorkerClientImpl::createWorkerContextProxy(worker);
diff --git a/WebKit/chromium/src/ChromiumThreading.cpp b/WebKit/chromium/src/ChromiumThreading.cpp
index 902a433..c6fefac 100644
--- a/WebKit/chromium/src/ChromiumThreading.cpp
+++ b/WebKit/chromium/src/ChromiumThreading.cpp
@@ -38,13 +38,9 @@
namespace WTF {
-void ChromiumThreading::initializeMainThread()
+void ChromiumThreading::callOnMainThread(void (*func)(void*), void* context)
{
-}
-
-void ChromiumThreading::scheduleDispatchFunctionsOnMainThread()
-{
- WebKit::webKitClient()->callOnMainThread(&WTF::dispatchFunctionsFromMainThread);
+ WebKit::webKitClient()->callOnMainThread(func, context);
}
} // namespace WTF
diff --git a/WebKit/chromium/src/DebuggerAgent.h b/WebKit/chromium/src/CompositionUnderlineBuilder.h
index 17cde11..ce62474 100644
--- a/WebKit/chromium/src/DebuggerAgent.h
+++ b/WebKit/chromium/src/CompositionUnderlineBuilder.h
@@ -28,29 +28,25 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef DebuggerAgent_h
-#define DebuggerAgent_h
+#ifndef CompositionUnderlineBuilder_h
+#define CompositionUnderlineBuilder_h
-#include "DevToolsRPC.h"
+#include "Editor.h"
+#include "Vector.h"
+#include "WebCompositionUnderline.h"
+#include "WebVector.h"
namespace WebKit {
-#define DEBUGGER_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \
- /* Requests global context id of the inspected tab. */ \
- METHOD0(getContextId) \
- \
- /* Request v8 to process all debug commands in the queue. */ \
- METHOD0(processDebugCommands)
+// This class is used for converting from WebCompositionUnderline to
+// WebCore::CompositionUnderline.
-DEFINE_RPC_CLASS(DebuggerAgent, DEBUGGER_AGENT_STRUCT)
-
-#define DEBUGGER_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \
- METHOD1(debuggerOutput, String /* output text */) \
- \
- /* Pushes debugger context id into the client. */ \
- METHOD1(setContextId, int /* context id */)
-
-DEFINE_RPC_CLASS(DebuggerAgentDelegate, DEBUGGER_AGENT_DELEGATE_STRUCT)
+class CompositionUnderlineBuilder : public WebCore::CompositionUnderline {
+public:
+ CompositionUnderlineBuilder(const WebCompositionUnderline& u)
+ : WebCore::CompositionUnderline(u.startOffset, u.endOffset,
+ WebCore::Color(u.color), u.thick) { }
+};
} // namespace WebKit
diff --git a/WebKit/chromium/src/ProfilerAgentImpl.cpp b/WebKit/chromium/src/CompositionUnderlineVectorBuilder.cpp
index 07570df..55dca85 100644
--- a/WebKit/chromium/src/ProfilerAgentImpl.cpp
+++ b/WebKit/chromium/src/CompositionUnderlineVectorBuilder.cpp
@@ -29,24 +29,21 @@
*/
#include "config.h"
-#include "ProfilerAgentImpl.h"
+#include "CompositionUnderlineVectorBuilder.h"
-#include <v8.h>
+#include "CompositionUnderlineBuilder.h"
-namespace WebKit {
+using namespace WebCore;
-void ProfilerAgentImpl::getActiveProfilerModules()
-{
- m_delegate->didGetActiveProfilerModules(v8::V8::GetActiveProfilerModules());
-}
+namespace WebKit {
-void ProfilerAgentImpl::getLogLines(int position)
+CompositionUnderlineVectorBuilder::CompositionUnderlineVectorBuilder(
+ const WebVector<WebCompositionUnderline>& underlines)
{
- static char buffer[65536];
- const int readSize = v8::V8::GetLogLines(position, buffer, sizeof(buffer) - 1);
- buffer[readSize] = '\0';
- position += readSize;
- m_delegate->didGetLogLines(position, buffer);
+ size_t size = underlines.size();
+ reserveCapacity(size);
+ for (size_t i = 0; i < size; ++i)
+ append(CompositionUnderlineBuilder(underlines[i]));
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/ProfilerAgentImpl.h b/WebKit/chromium/src/CompositionUnderlineVectorBuilder.h
index d38f57c..8050f02 100644
--- a/WebKit/chromium/src/ProfilerAgentImpl.h
+++ b/WebKit/chromium/src/CompositionUnderlineVectorBuilder.h
@@ -28,28 +28,24 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ProfilerAgentImpl_h
-#define ProfilerAgentImpl_h
+#ifndef CompositionUnderlineVectorBuilder_h
+#define CompositionUnderlineVectorBuilder_h
-#include "ProfilerAgent.h"
+#include "Editor.h"
+#include "Vector.h"
+#include "WebCompositionUnderline.h"
+#include "WebVector.h"
namespace WebKit {
-class ProfilerAgentImpl : public ProfilerAgent {
-public:
- ProfilerAgentImpl(ProfilerAgentDelegate* delegate) : m_delegate(delegate) { }
- virtual ~ProfilerAgentImpl() { }
-
- // ProfilerAgent implementation.
-
- // This method is called on IO thread.
- virtual void getActiveProfilerModules();
+// This classes are used for converting from std::vector<WebCompositionUnderline>
+// to Vector<WebCore::CompositionUnderline>.
- // This method is called on IO thread.
- virtual void getLogLines(int position);
-
-private:
- ProfilerAgentDelegate* m_delegate;
+class CompositionUnderlineVectorBuilder :
+ public Vector<WebCore::CompositionUnderline> {
+public:
+ CompositionUnderlineVectorBuilder(
+ const WebVector<WebCompositionUnderline>&);
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/ContextMenuClientImpl.cpp b/WebKit/chromium/src/ContextMenuClientImpl.cpp
index 8472082..d33a06b 100644
--- a/WebKit/chromium/src/ContextMenuClientImpl.cpp
+++ b/WebKit/chromium/src/ContextMenuClientImpl.cpp
@@ -46,6 +46,7 @@
#include "KURL.h"
#include "MediaError.h"
#include "PlatformString.h"
+#include "RenderWidget.h"
#include "TextBreakIterator.h"
#include "Widget.h"
@@ -53,6 +54,8 @@
#include "WebDataSourceImpl.h"
#include "WebFrameImpl.h"
#include "WebMenuItemInfo.h"
+#include "WebPlugin.h"
+#include "WebPluginContainerImpl.h"
#include "WebPoint.h"
#include "WebString.h"
#include "WebURL.h"
@@ -95,7 +98,7 @@ static bool isASingleWord(const String& text)
static String selectMisspelledWord(const ContextMenu* defaultMenu, Frame* selectedFrame)
{
// First select from selectedText to check for multiple word selection.
- String misspelledWord = selectedFrame->selectedText().stripWhiteSpace();
+ String misspelledWord = selectedFrame->editor()->selectedText().stripWhiteSpace();
// If some texts were already selected, we don't change the selection.
if (!misspelledWord.isEmpty()) {
@@ -116,7 +119,7 @@ static String selectMisspelledWord(const ContextMenu* defaultMenu, Frame* select
return misspelledWord; // It is empty.
WebFrameImpl::selectWordAroundPosition(selectedFrame, pos);
- misspelledWord = selectedFrame->selectedText().stripWhiteSpace();
+ misspelledWord = selectedFrame->editor()->selectedText().stripWhiteSpace();
#if OS(DARWIN)
// If misspelled word is still empty, then that portion should not be
@@ -147,13 +150,28 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
WebContextMenuData data;
data.mousePosition = selectedFrame->view()->contentsToWindow(r.point());
+ // Compute edit flags.
+ data.editFlags = WebContextMenuData::CanDoNone;
+ if (m_webView->focusedWebCoreFrame()->editor()->canUndo())
+ data.editFlags |= WebContextMenuData::CanUndo;
+ if (m_webView->focusedWebCoreFrame()->editor()->canRedo())
+ data.editFlags |= WebContextMenuData::CanRedo;
+ if (m_webView->focusedWebCoreFrame()->editor()->canCut())
+ data.editFlags |= WebContextMenuData::CanCut;
+ if (m_webView->focusedWebCoreFrame()->editor()->canCopy())
+ data.editFlags |= WebContextMenuData::CanCopy;
+ if (m_webView->focusedWebCoreFrame()->editor()->canPaste())
+ data.editFlags |= WebContextMenuData::CanPaste;
+ if (m_webView->focusedWebCoreFrame()->editor()->canDelete())
+ data.editFlags |= WebContextMenuData::CanDelete;
+ // We can always select all...
+ data.editFlags |= WebContextMenuData::CanSelectAll;
+ data.editFlags |= WebContextMenuData::CanTranslate;
+
// Links, Images, Media tags, and Image/Media-Links take preference over
// all else.
data.linkURL = r.absoluteLinkURL();
- data.mediaType = WebContextMenuData::MediaTypeNone;
- data.mediaFlags = WebContextMenuData::MediaNone;
-
if (!r.absoluteImageURL().isEmpty()) {
data.srcURL = r.absoluteImageURL();
data.mediaType = WebContextMenuData::MediaTypeImage;
@@ -181,10 +199,34 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
data.mediaFlags |= WebContextMenuData::MediaCanSave;
if (mediaElement->hasAudio())
data.mediaFlags |= WebContextMenuData::MediaHasAudio;
+ if (mediaElement->hasVideo())
+ data.mediaFlags |= WebContextMenuData::MediaHasVideo;
+ if (mediaElement->controls())
+ data.mediaFlags |= WebContextMenuData::MediaControls;
+ } else if (r.innerNonSharedNode()->hasTagName(HTMLNames::objectTag)
+ || r.innerNonSharedNode()->hasTagName(HTMLNames::embedTag)) {
+ RenderObject* object = r.innerNonSharedNode()->renderer();
+ if (object && object->isWidget()) {
+ Widget* widget = toRenderWidget(object)->widget();
+ if (widget && widget->isPluginContainer()) {
+ WebPluginContainerImpl* plugin = static_cast<WebPluginContainerImpl*>(widget);
+ WebString text = plugin->plugin()->selectionAsText();
+ if (!text.isEmpty()) {
+ data.selectedText = text;
+ data.editFlags |= WebContextMenuData::CanCopy;
+ }
+ data.editFlags &= ~WebContextMenuData::CanTranslate;
+ data.linkURL = plugin->plugin()->linkAtPosition(data.mousePosition);
+ }
+ }
}
+
+ data.isImageBlocked =
+ (data.mediaType == WebContextMenuData::MediaTypeImage) && !r.image();
+
// If it's not a link, an image, a media element, or an image/media link,
// show a selection menu or a more generic page menu.
- data.frameEncoding = selectedFrame->loader()->encoding();
+ data.frameEncoding = selectedFrame->loader()->writer()->encoding();
// Send the frame and page URLs in any case.
data.pageURL = urlFromFrame(m_webView->mainFrameImpl()->frame());
@@ -192,23 +234,19 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
data.frameURL = urlFromFrame(selectedFrame);
if (r.isSelected())
- data.selectedText = selectedFrame->selectedText().stripWhiteSpace();
+ data.selectedText = selectedFrame->editor()->selectedText().stripWhiteSpace();
- data.isEditable = false;
if (r.isContentEditable()) {
data.isEditable = true;
if (m_webView->focusedWebCoreFrame()->editor()->isContinuousSpellCheckingEnabled()) {
data.isSpellCheckingEnabled = true;
- data.misspelledWord = selectMisspelledWord(defaultMenu, selectedFrame);
+ // Spellchecking might be enabled for the field, but could be disabled on the node.
+ if (m_webView->focusedWebCoreFrame()->editor()->isSpellCheckingEnabledInFocusedNode())
+ data.misspelledWord = selectMisspelledWord(defaultMenu, selectedFrame);
}
}
#if OS(DARWIN)
- // Writing direction context menu.
- data.writingDirectionDefault = WebContextMenuData::CheckableMenuItemDisabled;
- data.writingDirectionLeftToRight = WebContextMenuData::CheckableMenuItemEnabled;
- data.writingDirectionRightToLeft = WebContextMenuData::CheckableMenuItemEnabled;
-
ExceptionCode ec = 0;
RefPtr<CSSStyleDeclaration> style = selectedFrame->document()->createCSSStyleDeclaration();
style->setProperty(CSSPropertyDirection, "ltr", false, ec);
@@ -225,23 +263,6 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
if (ds)
data.securityInfo = ds->response().securityInfo();
- // Compute edit flags.
- data.editFlags = WebContextMenuData::CanDoNone;
- if (m_webView->focusedWebCoreFrame()->editor()->canUndo())
- data.editFlags |= WebContextMenuData::CanUndo;
- if (m_webView->focusedWebCoreFrame()->editor()->canRedo())
- data.editFlags |= WebContextMenuData::CanRedo;
- if (m_webView->focusedWebCoreFrame()->editor()->canCut())
- data.editFlags |= WebContextMenuData::CanCut;
- if (m_webView->focusedWebCoreFrame()->editor()->canCopy())
- data.editFlags |= WebContextMenuData::CanCopy;
- if (m_webView->focusedWebCoreFrame()->editor()->canPaste())
- data.editFlags |= WebContextMenuData::CanPaste;
- if (m_webView->focusedWebCoreFrame()->editor()->canDelete())
- data.editFlags |= WebContextMenuData::CanDelete;
- // We can always select all...
- data.editFlags |= WebContextMenuData::CanSelectAll;
-
// Filter out custom menu elements and add them into the data.
populateCustomMenuItems(defaultMenu, &data);
@@ -257,7 +278,7 @@ void ContextMenuClientImpl::populateCustomMenuItems(WebCore::ContextMenu* defaul
Vector<WebMenuItemInfo> customItems;
for (size_t i = 0; i < defaultMenu->itemCount(); ++i) {
ContextMenuItem* inputItem = defaultMenu->itemAtIndex(i, defaultMenu->platformDescription());
- if (inputItem->action() < ContextMenuItemBaseCustomTag || inputItem->action() >= ContextMenuItemBaseApplicationTag)
+ if (inputItem->action() < ContextMenuItemBaseCustomTag || inputItem->action() > ContextMenuItemLastCustomTag)
continue;
WebMenuItemInfo outputItem;
diff --git a/WebKit/chromium/src/ContextMenuClientImpl.h b/WebKit/chromium/src/ContextMenuClientImpl.h
index 4191fad..97ea967 100644
--- a/WebKit/chromium/src/ContextMenuClientImpl.h
+++ b/WebKit/chromium/src/ContextMenuClientImpl.h
@@ -51,7 +51,7 @@ public:
virtual void lookUpInDictionary(WebCore::Frame*) {}
virtual void searchWithGoogle(const WebCore::Frame*) {}
virtual bool shouldIncludeInspectElementItem() { return false; }
- virtual void speak(const WebCore::String&) {}
+ virtual void speak(const WTF::String&) {}
virtual void stopSpeaking() {}
private:
void populateCustomMenuItems(WebCore::ContextMenu*, WebContextMenuData*);
diff --git a/WebKit/chromium/src/DOMUtilitiesPrivate.cpp b/WebKit/chromium/src/DOMUtilitiesPrivate.cpp
index 4081db6..6f952f7 100644
--- a/WebKit/chromium/src/DOMUtilitiesPrivate.cpp
+++ b/WebKit/chromium/src/DOMUtilitiesPrivate.cpp
@@ -97,7 +97,7 @@ bool elementHasLegalLinkAttribute(const Element* element,
if (element->hasTagName(HTMLNames::inputTag)) {
const HTMLInputElement* input =
static_cast<const HTMLInputElement*>(element);
- if (input->inputType() == HTMLInputElement::IMAGE)
+ if (input->isImageButton())
return true;
}
} else if (attrName == HTMLNames::hrefAttr) {
diff --git a/WebKit/chromium/src/DOMUtilitiesPrivate.h b/WebKit/chromium/src/DOMUtilitiesPrivate.h
index 253ab3f..f5d03a5 100644
--- a/WebKit/chromium/src/DOMUtilitiesPrivate.h
+++ b/WebKit/chromium/src/DOMUtilitiesPrivate.h
@@ -31,6 +31,8 @@
#ifndef DOMUtilitiesPrivate_h
#define DOMUtilitiesPrivate_h
+#include <wtf/Forward.h>
+
namespace WebCore {
class Element;
class HTMLInputElement;
@@ -39,7 +41,6 @@ class HTMLMetaElement;
class HTMLOptionElement;
class Node;
class QualifiedName;
-class String;
}
// This file is an aggregate of useful WebCore operations.
@@ -53,7 +54,7 @@ WebCore::HTMLMetaElement* toHTMLMetaElement(WebCore::Node*);
WebCore::HTMLOptionElement* toHTMLOptionElement(WebCore::Node*);
// FIXME: Deprecate. Use WebInputElement::nameForAutofill instead.
-WebCore::String nameOfInputElement(WebCore::HTMLInputElement*);
+WTF::String nameOfInputElement(WebCore::HTMLInputElement*);
// For img, script, iframe, frame element, when attribute name is src,
// for link, a, area element, when attribute name is href,
diff --git a/WebKit/chromium/src/DatabaseObserver.cpp b/WebKit/chromium/src/DatabaseObserver.cpp
index 54e93e1..f43c9bd 100644
--- a/WebKit/chromium/src/DatabaseObserver.cpp
+++ b/WebKit/chromium/src/DatabaseObserver.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -31,30 +31,60 @@
#include "config.h"
#include "DatabaseObserver.h"
-#include "Database.h"
+#if ENABLE(DATABASE)
+
+#include "AbstractDatabase.h"
+#include "Document.h"
+#include "ScriptExecutionContext.h"
#include "WebDatabase.h"
#include "WebDatabaseObserver.h"
+#include "WebFrameClient.h"
+#include "WebFrameImpl.h"
+#include "WebSecurityOrigin.h"
+#include "WebWorkerImpl.h"
+#include "WorkerContext.h"
+#include "WorkerThread.h"
using namespace WebKit;
namespace WebCore {
-void DatabaseObserver::databaseOpened(Database* database)
+bool DatabaseObserver::canEstablishDatabase(ScriptExecutionContext* scriptExecutionContext, const String& name, const String& displayName, unsigned long estimatedSize)
+{
+ ASSERT(scriptExecutionContext->isContextThread());
+ ASSERT(scriptExecutionContext->isDocument() || scriptExecutionContext->isWorkerContext());
+ if (scriptExecutionContext->isDocument()) {
+ Document* document = static_cast<Document*>(scriptExecutionContext);
+ WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame());
+ return webFrame->client()->allowDatabase(webFrame, name, displayName, estimatedSize);
+ } else {
+ WorkerContext* workerContext = static_cast<WorkerContext*>(scriptExecutionContext);
+ WorkerLoaderProxy* workerLoaderProxy = &workerContext->thread()->workerLoaderProxy();
+ WebWorkerBase* webWorker = static_cast<WebWorkerBase*>(workerLoaderProxy);
+ return webWorker->allowDatabase(0, name, displayName, estimatedSize);
+ }
+
+ return true;
+}
+
+void DatabaseObserver::databaseOpened(AbstractDatabase* database)
{
- ASSERT(isMainThread());
+ ASSERT(database->scriptExecutionContext()->isContextThread());
WebDatabase::observer()->databaseOpened(WebDatabase(database));
}
-void DatabaseObserver::databaseModified(Database* database)
+void DatabaseObserver::databaseModified(AbstractDatabase* database)
{
- ASSERT(isMainThread());
+ ASSERT(database->scriptExecutionContext()->isContextThread());
WebDatabase::observer()->databaseModified(WebDatabase(database));
}
-void DatabaseObserver::databaseClosed(Database* database)
+void DatabaseObserver::databaseClosed(AbstractDatabase* database)
{
- ASSERT(isMainThread());
+ ASSERT(database->scriptExecutionContext()->isContextThread());
WebDatabase::observer()->databaseClosed(WebDatabase(database));
}
} // namespace WebCore
+
+#endif // ENABLE(DATABASE)
diff --git a/WebKit/chromium/src/DebuggerAgentImpl.cpp b/WebKit/chromium/src/DebuggerAgentImpl.cpp
index d592710..5dd5c58 100644
--- a/WebKit/chromium/src/DebuggerAgentImpl.cpp
+++ b/WebKit/chromium/src/DebuggerAgentImpl.cpp
@@ -32,38 +32,21 @@
#include "DebuggerAgentImpl.h"
#include "DebuggerAgentManager.h"
-#include "Document.h"
-#include "Frame.h"
-#include "Page.h"
-#include "V8Binding.h"
-#include "V8DOMWindow.h"
-#include "V8Index.h"
-#include "V8Proxy.h"
+#include "WebDevToolsAgentClient.h"
#include "WebDevToolsAgentImpl.h"
#include "WebViewImpl.h"
-#include <wtf/HashSet.h>
-#include <wtf/RefPtr.h>
-#include <wtf/Vector.h>
-using WebCore::DOMWindow;
-using WebCore::Document;
-using WebCore::Frame;
-using WebCore::Page;
-using WebCore::String;
-using WebCore::V8ClassIndex;
-using WebCore::V8DOMWindow;
-using WebCore::V8DOMWrapper;
-using WebCore::V8Proxy;
+using WTF::String;
namespace WebKit {
DebuggerAgentImpl::DebuggerAgentImpl(
WebViewImpl* webViewImpl,
- DebuggerAgentDelegate* delegate,
- WebDevToolsAgentImpl* webdevtoolsAgent)
+ WebDevToolsAgentImpl* webdevtoolsAgent,
+ WebDevToolsAgentClient* webdevtoolsAgentClient)
: m_webViewImpl(webViewImpl)
- , m_delegate(delegate)
, m_webdevtoolsAgent(webdevtoolsAgent)
+ , m_webdevtoolsAgentClient(webdevtoolsAgentClient)
, m_autoContinueOnException(false)
{
DebuggerAgentManager::debugAttach(this);
@@ -74,125 +57,9 @@ DebuggerAgentImpl::~DebuggerAgentImpl()
DebuggerAgentManager::debugDetach(this);
}
-void DebuggerAgentImpl::getContextId()
-{
- m_delegate->setContextId(m_webdevtoolsAgent->hostId());
-}
-
-void DebuggerAgentImpl::processDebugCommands()
-{
- DebuggerAgentManager::UtilityContextScope utilityScope;
- v8::Debug::ProcessDebugMessages();
-}
-
void DebuggerAgentImpl::debuggerOutput(const String& command)
{
- m_delegate->debuggerOutput(command);
- m_webdevtoolsAgent->forceRepaint();
-}
-
-// static
-void DebuggerAgentImpl::createUtilityContext(Frame* frame, v8::Persistent<v8::Context>* context)
-{
- v8::HandleScope scope;
- bool canExecuteScripts = frame->script()->canExecuteScripts();
-
- // Set up the DOM window as the prototype of the new global object.
- v8::Handle<v8::Context> windowContext = V8Proxy::context(frame);
- v8::Handle<v8::Object> windowGlobal;
- v8::Handle<v8::Object> windowWrapper;
- if (canExecuteScripts) {
- // FIXME: This check prevents renderer from crashing, while providing limited capabilities for
- // DOM inspection, Resources tracking, no scripts support, some timeline profiling. Console will
- // result in exceptions for each evaluation. There is still some work that needs to be done in
- // order to polish the script-less experience.
- windowGlobal = windowContext->Global();
- windowWrapper = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), windowGlobal);
- ASSERT(V8DOMWindow::toNative(windowWrapper) == frame->domWindow());
- }
-
- v8::Handle<v8::ObjectTemplate> globalTemplate = v8::ObjectTemplate::New();
-
- // TODO(yurys): provide a function in v8 bindings that would make the
- // utility context more like main world context of the inspected frame,
- // otherwise we need to manually make it satisfy various invariants
- // that V8Proxy::getEntered and some other V8Proxy methods expect to find
- // on v8 contexts on the contexts stack.
- // See V8Proxy::createNewContext.
- //
- // Install a security handler with V8.
- globalTemplate->SetAccessCheckCallbacks(
- V8DOMWindow::namedSecurityCheck,
- V8DOMWindow::indexedSecurityCheck,
- v8::Integer::New(V8ClassIndex::DOMWINDOW));
- // We set number of internal fields to match that in V8DOMWindow wrapper.
- // See http://crbug.com/28961
- globalTemplate->SetInternalFieldCount(V8DOMWindow::internalFieldCount);
-
- *context = v8::Context::New(0 /* no extensions */, globalTemplate, v8::Handle<v8::Object>());
- v8::Context::Scope contextScope(*context);
- v8::Handle<v8::Object> global = (*context)->Global();
-
- v8::Handle<v8::String> implicitProtoString = v8::String::New("__proto__");
- if (canExecuteScripts)
- global->Set(implicitProtoString, windowWrapper);
-
- // Give the code running in the new context a way to get access to the
- // original context.
- if (canExecuteScripts)
- global->Set(v8::String::New("contentWindow"), windowGlobal);
-}
-
-String DebuggerAgentImpl::executeUtilityFunction(
- v8::Handle<v8::Context> context,
- int callId,
- const char* object,
- const String &functionName,
- const String& jsonArgs,
- bool async,
- String* exception)
-{
- v8::HandleScope scope;
- ASSERT(!context.IsEmpty());
- if (context.IsEmpty()) {
- *exception = "No window context.";
- return "";
- }
- v8::Context::Scope contextScope(context);
-
- DebuggerAgentManager::UtilityContextScope utilityScope;
-
- v8::Handle<v8::Object> dispatchObject = v8::Handle<v8::Object>::Cast(
- context->Global()->Get(v8::String::New(object)));
-
- v8::Handle<v8::Value> dispatchFunction = dispatchObject->Get(v8::String::New("dispatch"));
- ASSERT(dispatchFunction->IsFunction());
- v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(dispatchFunction);
-
- v8::Handle<v8::String> functionNameWrapper = v8::Handle<v8::String>(
- v8::String::New(functionName.utf8().data()));
- v8::Handle<v8::String> jsonArgsWrapper = v8::Handle<v8::String>(
- v8::String::New(jsonArgs.utf8().data()));
- v8::Handle<v8::Number> callIdWrapper = v8::Handle<v8::Number>(
- v8::Number::New(async ? callId : 0));
-
- v8::Handle<v8::Value> args[] = {
- functionNameWrapper,
- jsonArgsWrapper,
- callIdWrapper
- };
-
- v8::TryCatch tryCatch;
- v8::Handle<v8::Value> resObj = function->Call(context->Global(), 3, args);
- if (tryCatch.HasCaught()) {
- v8::Local<v8::Message> message = tryCatch.Message();
- if (message.IsEmpty())
- *exception = "Unknown exception";
- else
- *exception = WebCore::toWebCoreString(message->Get());
- return "";
- }
- return WebCore::toWebCoreStringWithNullCheck(resObj);
+ m_webdevtoolsAgentClient->sendDebuggerOutput(command);
}
WebCore::Page* DebuggerAgentImpl::page()
diff --git a/WebKit/chromium/src/DebuggerAgentImpl.h b/WebKit/chromium/src/DebuggerAgentImpl.h
index 6eaf576..a8fcc4e 100644
--- a/WebKit/chromium/src/DebuggerAgentImpl.h
+++ b/WebKit/chromium/src/DebuggerAgentImpl.h
@@ -31,58 +31,31 @@
#ifndef DebuggerAgentImpl_h
#define DebuggerAgentImpl_h
-#include "DebuggerAgent.h"
-
-#include <v8.h>
-#include <wtf/HashSet.h>
-#include <wtf/Noncopyable.h>
+#include <wtf/Forward.h>
namespace WebCore {
-class Document;
-class Frame;
-class Node;
class Page;
-class String;
}
namespace WebKit {
+class WebDevToolsAgentClient;
class WebDevToolsAgentImpl;
class WebViewImpl;
-class DebuggerAgentImpl : public DebuggerAgent {
+class DebuggerAgentImpl {
public:
- // Creates utility context with injected js agent.
- static void createUtilityContext(WebCore::Frame* frame, v8::Persistent<v8::Context>* context);
-
DebuggerAgentImpl(WebKit::WebViewImpl* webViewImpl,
- DebuggerAgentDelegate* delegate,
- WebDevToolsAgentImpl* webdevtoolsAgent);
+ WebDevToolsAgentImpl* webdevtoolsAgent,
+ WebDevToolsAgentClient* webdevtoolsAgentClient);
virtual ~DebuggerAgentImpl();
- // DebuggerAgent implementation.
- virtual void getContextId();
- virtual void processDebugCommands();
-
- void debuggerOutput(const WebCore::String& out);
+ void debuggerOutput(const WTF::String& out);
void setAutoContinueOnException(bool autoContinue) { m_autoContinueOnException = autoContinue; }
bool autoContinueOnException() { return m_autoContinueOnException; }
- // Executes function with the given name in the utility context. Passes node
- // and json args as parameters. Note that the function called must be
- // implemented in the inject_dispatch.js file.
- WebCore::String executeUtilityFunction(
- v8::Handle<v8::Context> context,
- int callId,
- const char* object,
- const WebCore::String& functionName,
- const WebCore::String& jsonArgs,
- bool async,
- WebCore::String* exception);
-
-
WebCore::Page* page();
WebDevToolsAgentImpl* webdevtoolsAgent() { return m_webdevtoolsAgent; }
@@ -90,8 +63,8 @@ public:
private:
WebKit::WebViewImpl* m_webViewImpl;
- DebuggerAgentDelegate* m_delegate;
WebDevToolsAgentImpl* m_webdevtoolsAgent;
+ WebDevToolsAgentClient* m_webdevtoolsAgentClient;
bool m_autoContinueOnException;
};
diff --git a/WebKit/chromium/src/DebuggerAgentManager.cpp b/WebKit/chromium/src/DebuggerAgentManager.cpp
index faafaff..0860cb1 100644
--- a/WebKit/chromium/src/DebuggerAgentManager.cpp
+++ b/WebKit/chromium/src/DebuggerAgentManager.cpp
@@ -34,12 +34,14 @@
#include "DebuggerAgentImpl.h"
#include "Frame.h"
#include "PageGroupLoadDeferrer.h"
+#include "ScriptDebugServer.h"
#include "V8Proxy.h"
#include "WebDevToolsAgentImpl.h"
#include "WebFrameImpl.h"
#include "WebViewImpl.h"
#include <wtf/HashSet.h>
#include <wtf/Noncopyable.h>
+#include <wtf/text/StringConcatenate.h>
namespace WebKit {
@@ -49,9 +51,7 @@ bool DebuggerAgentManager::s_inHostDispatchHandler = false;
DebuggerAgentManager::DeferrersMap DebuggerAgentManager::s_pageDeferrers;
-bool DebuggerAgentManager::s_inUtilityContext = false;
-
-bool DebuggerAgentManager::s_debugBreakDelayed = false;
+bool DebuggerAgentManager::s_exposeV8DebuggerProtocol = false;
namespace {
@@ -116,6 +116,8 @@ DebuggerAgentManager::AttachedAgentsMap* DebuggerAgentManager::s_attachedAgentsM
void DebuggerAgentManager::debugAttach(DebuggerAgentImpl* debuggerAgent)
{
+ if (!s_exposeV8DebuggerProtocol)
+ return;
if (!s_attachedAgentsMap) {
s_attachedAgentsMap = new AttachedAgentsMap();
v8::Debug::SetMessageHandler2(&DebuggerAgentManager::onV8DebugMessage);
@@ -128,6 +130,8 @@ void DebuggerAgentManager::debugAttach(DebuggerAgentImpl* debuggerAgent)
void DebuggerAgentManager::debugDetach(DebuggerAgentImpl* debuggerAgent)
{
+ if (!s_exposeV8DebuggerProtocol)
+ return;
if (!s_attachedAgentsMap) {
ASSERT_NOT_REACHED();
return;
@@ -150,10 +154,9 @@ void DebuggerAgentManager::debugDetach(DebuggerAgentImpl* debuggerAgent)
}
} else {
// Remove all breakpoints set by the agent.
- String clearBreakpointGroupCmd = String::format(
+ String clearBreakpointGroupCmd = makeString(
"{\"seq\":1,\"type\":\"request\",\"command\":\"clearbreakpointgroup\","
- "\"arguments\":{\"groupId\":%d}}",
- hostId);
+ "\"arguments\":{\"groupId\":", String::number(hostId), "}}");
sendCommandToV8(clearBreakpointGroupCmd, new CallerIdWrapper());
if (isOnBreakpoint) {
@@ -169,7 +172,7 @@ void DebuggerAgentManager::onV8DebugMessage(const v8::Debug::Message& message)
{
v8::HandleScope scope;
v8::String::Value value(message.GetJSON());
- String out(reinterpret_cast<const UChar*>(*value), value.length());
+ WTF::String out(reinterpret_cast<const UChar*>(*value), value.length());
// If callerData is not 0 the message is a response to a debugger command.
if (v8::Debug::ClientData* callerData = message.GetClientData()) {
@@ -201,28 +204,20 @@ void DebuggerAgentManager::onV8DebugMessage(const v8::Debug::Message& message)
return;
}
- if (s_inUtilityContext && message.GetEvent() == v8::Break) {
- // This may happen when two tabs are being debugged in the same process.
- // Suppose that first debugger is pauesed on an exception. It will run
- // nested MessageLoop which may process Break request from the second
- // debugger.
- s_debugBreakDelayed = true;
- } else {
- // If the context is from one of the inpected tabs or injected extension
- // scripts it must have hostId in the data field.
- int hostId = WebCore::V8Proxy::contextDebugId(context);
- if (hostId != -1) {
- DebuggerAgentImpl* agent = debuggerAgentForHostId(hostId);
- if (agent) {
- if (agent->autoContinueOnException()
- && message.GetEvent() == v8::Exception) {
- sendContinueCommandToV8();
- return;
- }
-
- agent->debuggerOutput(out);
+ // If the context is from one of the inpected tabs or injected extension
+ // scripts it must have hostId in the data field.
+ int hostId = WebCore::V8Proxy::contextDebugId(context);
+ if (hostId != -1) {
+ DebuggerAgentImpl* agent = debuggerAgentForHostId(hostId);
+ if (agent) {
+ if (agent->autoContinueOnException()
+ && message.GetEvent() == v8::Exception) {
+ sendContinueCommandToV8();
return;
}
+
+ agent->debuggerOutput(out);
+ return;
}
}
@@ -235,13 +230,10 @@ void DebuggerAgentManager::onV8DebugMessage(const v8::Debug::Message& message)
void DebuggerAgentManager::pauseScript()
{
- if (s_inUtilityContext)
- s_debugBreakDelayed = true;
- else
- v8::Debug::DebugBreak();
+ v8::Debug::DebugBreak();
}
-void DebuggerAgentManager::executeDebuggerCommand(const String& command, int callerId)
+void DebuggerAgentManager::executeDebuggerCommand(const WTF::String& command, int callerId)
{
sendCommandToV8(command, new CallerIdWrapper(callerId));
}
@@ -251,6 +243,12 @@ void DebuggerAgentManager::setMessageLoopDispatchHandler(WebDevToolsAgent::Messa
s_messageLoopDispatchHandler = handler;
}
+void DebuggerAgentManager::setExposeV8DebuggerProtocol(bool value)
+{
+ s_exposeV8DebuggerProtocol = value;
+ WebCore::ScriptDebugServer::shared().setEnabled(!s_exposeV8DebuggerProtocol);
+}
+
void DebuggerAgentManager::setHostId(WebFrameImpl* webframe, int hostId)
{
ASSERT(hostId > 0);
@@ -273,14 +271,14 @@ void DebuggerAgentManager::onNavigate()
DebuggerAgentManager::sendContinueCommandToV8();
}
-void DebuggerAgentManager::sendCommandToV8(const String& cmd, v8::Debug::ClientData* data)
+void DebuggerAgentManager::sendCommandToV8(const WTF::String& cmd, v8::Debug::ClientData* data)
{
v8::Debug::SendCommand(reinterpret_cast<const uint16_t*>(cmd.characters()), cmd.length(), data);
}
void DebuggerAgentManager::sendContinueCommandToV8()
{
- String continueCmd("{\"seq\":1,\"type\":\"request\",\"command\":\"continue\"}");
+ WTF::String continueCmd("{\"seq\":1,\"type\":\"request\",\"command\":\"continue\"}");
sendCommandToV8(continueCmd, new CallerIdWrapper());
}
diff --git a/WebKit/chromium/src/DebuggerAgentManager.h b/WebKit/chromium/src/DebuggerAgentManager.h
index a2e9030..66bd714 100644
--- a/WebKit/chromium/src/DebuggerAgentManager.h
+++ b/WebKit/chromium/src/DebuggerAgentManager.h
@@ -31,14 +31,17 @@
#ifndef DebuggerAgentManager_h
#define DebuggerAgentManager_h
+#include "WebCString.h"
#include "WebDevToolsAgent.h"
#include <v8-debug.h>
+#include <wtf/Forward.h>
#include <wtf/HashMap.h>
#include <wtf/Noncopyable.h>
+#include <wtf/Vector.h>
namespace WebCore {
+class Page;
class PageGroupLoadDeferrer;
-class String;
}
namespace WebKit {
@@ -65,8 +68,9 @@ public:
static void debugAttach(DebuggerAgentImpl* debuggerAgent);
static void debugDetach(DebuggerAgentImpl* debuggerAgent);
static void pauseScript();
- static void executeDebuggerCommand(const WebCore::String& command, int callerId);
+ static void executeDebuggerCommand(const WTF::String& command, int callerId);
static void setMessageLoopDispatchHandler(WebDevToolsAgent::MessageLoopDispatchHandler handler);
+ static void setExposeV8DebuggerProtocol(bool);
// Sets |hostId| as the frame context data. This id is used to filter scripts
// related to the inspected page.
@@ -76,30 +80,13 @@ public:
static void onNavigate();
- class UtilityContextScope : public Noncopyable {
- public:
- UtilityContextScope()
- {
- ASSERT(!s_inUtilityContext);
- s_inUtilityContext = true;
- }
- ~UtilityContextScope()
- {
- if (s_debugBreakDelayed) {
- v8::Debug::DebugBreak();
- s_debugBreakDelayed = false;
- }
- s_inUtilityContext = false;
- }
- };
-
private:
DebuggerAgentManager();
~DebuggerAgentManager();
static void debugHostDispatchHandler();
static void onV8DebugMessage(const v8::Debug::Message& message);
- static void sendCommandToV8(const WebCore::String& cmd,
+ static void sendCommandToV8(const WTF::String& cmd,
v8::Debug::ClientData* data);
static void sendContinueCommandToV8();
@@ -114,8 +101,7 @@ private:
typedef HashMap<WebViewImpl*, WebCore::PageGroupLoadDeferrer*> DeferrersMap;
static DeferrersMap s_pageDeferrers;
- static bool s_inUtilityContext;
- static bool s_debugBreakDelayed;
+ static bool s_exposeV8DebuggerProtocol;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/DevToolsRPC.h b/WebKit/chromium/src/DevToolsRPC.h
deleted file mode 100644
index 7176821..0000000
--- a/WebKit/chromium/src/DevToolsRPC.h
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-// DevTools RPC subsystem is a simple string serialization-based rpc
-// implementation. The client is responsible for defining the Rpc-enabled
-// interface in terms of its macros:
-//
-// #define MYAPI_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3)
-// METHOD0(Method1)
-// METHOD1(Method3, int)
-// (snippet above should be multiline macro, add trailing backslashes)
-//
-// DEFINE_RPC_CLASS(MyApi, MYAPI_STRUCT)
-//
-// The snippet above will generate three classes: MyApi, MyApiStub and
-// MyApiDispatch.
-//
-// 1. For each method defined in the marco MyApi will have a
-// pure virtual function generated, so that MyApi would look like:
-//
-// class MyApi {
-// private:
-// MyApi() { }
-// ~MyApi() { }
-// virtual void method1() = 0;
-// virtual void method2(
-// int param1,
-// const String& param2,
-// const Value& param3) = 0;
-// virtual void method3(int param1) = 0;
-// };
-//
-// 2. MyApiStub will implement MyApi interface and would serialize all calls
-// into the string-based calls of the underlying transport:
-//
-// DevToolsRPC::Delegate* transport;
-// myApi = new MyApiStub(transport);
-// myApi->method1();
-// myApi->method3(2);
-//
-// 3. MyApiDelegate is capable of dispatching the calls and convert them to the
-// calls to the underlying MyApi methods:
-//
-// MyApi* realObject;
-// MyApiDispatch::dispatch(realObject, rawStringCallGeneratedByStub);
-//
-// will make corresponding calls to the real object.
-
-#ifndef DevToolsRPC_h
-#define DevToolsRPC_h
-
-#include "PlatformString.h"
-#include "Vector.h"
-#include "WebDevToolsMessageData.h"
-
-#include <wtf/Noncopyable.h>
-
-namespace WebCore {
-class String;
-}
-
-using WebCore::String;
-using WTF::Vector;
-
-namespace WebKit {
-
-///////////////////////////////////////////////////////
-// RPC dispatch macro
-
-template<typename T>
-struct RpcTypeTrait {
- typedef T ApiType;
-};
-
-template<>
-struct RpcTypeTrait<bool> {
- typedef bool ApiType;
- static bool parse(const WebCore::String& t)
- {
- return t == "true";
- }
- static WebCore::String toString(bool b)
- {
- return b ? "true" : "false";
- }
-};
-
-template<>
-struct RpcTypeTrait<int> {
- typedef int ApiType;
- static int parse(const WebCore::String& t)
- {
- bool success;
- int i = t.toIntStrict(&success);
- ASSERT(success);
- return i;
- }
- static WebCore::String toString(int i)
- {
- return WebCore::String::number(i);
- }
-};
-
-template<>
-struct RpcTypeTrait<String> {
- typedef const String& ApiType;
- static String parse(const WebCore::String& t)
- {
- return t;
- }
- static WebCore::String toString(const String& t)
- {
- return t;
- }
-};
-
-///////////////////////////////////////////////////////
-// RPC Api method declarations
-
-#define TOOLS_RPC_API_METHOD0(Method) \
- virtual void Method() = 0;
-
-#define TOOLS_RPC_API_METHOD1(Method, T1) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1) = 0;
-
-#define TOOLS_RPC_API_METHOD2(Method, T1, T2) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1, \
- RpcTypeTrait<T2>::ApiType t2) = 0;
-
-#define TOOLS_RPC_API_METHOD3(Method, T1, T2, T3) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1, \
- RpcTypeTrait<T2>::ApiType t2, \
- RpcTypeTrait<T3>::ApiType t3) = 0;
-
-#define TOOLS_RPC_API_METHOD4(Method, T1, T2, T3, T4) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1, \
- RpcTypeTrait<T2>::ApiType t2, \
- RpcTypeTrait<T3>::ApiType t3, \
- RpcTypeTrait<T4>::ApiType t4) = 0;
-
-#define TOOLS_RPC_API_METHOD5(Method, T1, T2, T3, T4, T5) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1, \
- RpcTypeTrait<T2>::ApiType t2, \
- RpcTypeTrait<T3>::ApiType t3, \
- RpcTypeTrait<T4>::ApiType t4, \
- RpcTypeTrait<T5>::ApiType t5) = 0;
-
-///////////////////////////////////////////////////////
-// RPC stub method implementations
-
-#define TOOLS_RPC_STUB_METHOD0(Method) \
- virtual void Method() { \
- Vector<String> args; \
- this->sendRpcMessage(m_className, #Method, args); \
- }
-
-#define TOOLS_RPC_STUB_METHOD1(Method, T1) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1) { \
- Vector<String> args(1); \
- args[0] = RpcTypeTrait<T1>::toString(t1); \
- this->sendRpcMessage(m_className, #Method, args); \
- }
-
-#define TOOLS_RPC_STUB_METHOD2(Method, T1, T2) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1, \
- RpcTypeTrait<T2>::ApiType t2) { \
- Vector<String> args(2); \
- args[0] = RpcTypeTrait<T1>::toString(t1); \
- args[1] = RpcTypeTrait<T2>::toString(t2); \
- this->sendRpcMessage(m_className, #Method, args); \
- }
-
-#define TOOLS_RPC_STUB_METHOD3(Method, T1, T2, T3) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1, \
- RpcTypeTrait<T2>::ApiType t2, \
- RpcTypeTrait<T3>::ApiType t3) { \
- Vector<String> args(3); \
- args[0] = RpcTypeTrait<T1>::toString(t1); \
- args[1] = RpcTypeTrait<T2>::toString(t2); \
- args[2] = RpcTypeTrait<T3>::toString(t3); \
- this->sendRpcMessage(m_className, #Method, args); \
- }
-
-#define TOOLS_RPC_STUB_METHOD4(Method, T1, T2, T3, T4) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1, \
- RpcTypeTrait<T2>::ApiType t2, \
- RpcTypeTrait<T3>::ApiType t3, \
- RpcTypeTrait<T4>::ApiType t4) { \
- Vector<String> args(4); \
- args[0] = RpcTypeTrait<T1>::toString(t1); \
- args[1] = RpcTypeTrait<T2>::toString(t2); \
- args[2] = RpcTypeTrait<T3>::toString(t3); \
- args[3] = RpcTypeTrait<T4>::toString(t4); \
- this->sendRpcMessage(m_className, #Method, args); \
- }
-
-#define TOOLS_RPC_STUB_METHOD5(Method, T1, T2, T3, T4, T5) \
- virtual void Method(RpcTypeTrait<T1>::ApiType t1, \
- RpcTypeTrait<T2>::ApiType t2, \
- RpcTypeTrait<T3>::ApiType t3, \
- RpcTypeTrait<T4>::ApiType t4, \
- RpcTypeTrait<T5>::ApiType t5) { \
- Vector<String> args(5); \
- args[0] = RpcTypeTrait<T1>::toString(t1); \
- args[1] = RpcTypeTrait<T2>::toString(t2); \
- args[2] = RpcTypeTrait<T3>::toString(t3); \
- args[3] = RpcTypeTrait<T4>::toString(t4); \
- args[4] = RpcTypeTrait<T5>::toString(t5); \
- this->sendRpcMessage(m_className, #Method, args); \
- }
-
-///////////////////////////////////////////////////////
-// RPC dispatch method implementations
-
-#define TOOLS_RPC_DISPATCH0(Method) \
-if (methodName == #Method) { \
- delegate->Method(); \
- return true; \
-}
-
-#define TOOLS_RPC_DISPATCH1(Method, T1) \
-if (methodName == #Method) { \
- delegate->Method(RpcTypeTrait<T1>::parse(args[0])); \
- return true; \
-}
-
-#define TOOLS_RPC_DISPATCH2(Method, T1, T2) \
-if (methodName == #Method) { \
- delegate->Method( \
- RpcTypeTrait<T1>::parse(args[0]), \
- RpcTypeTrait<T2>::parse(args[1]) \
- ); \
- return true; \
-}
-
-#define TOOLS_RPC_DISPATCH3(Method, T1, T2, T3) \
-if (methodName == #Method) { \
- delegate->Method( \
- RpcTypeTrait<T1>::parse(args[0]), \
- RpcTypeTrait<T2>::parse(args[1]), \
- RpcTypeTrait<T3>::parse(args[2]) \
- ); \
- return true; \
-}
-
-#define TOOLS_RPC_DISPATCH4(Method, T1, T2, T3, T4) \
-if (methodName == #Method) { \
- delegate->Method( \
- RpcTypeTrait<T1>::parse(args[0]), \
- RpcTypeTrait<T2>::parse(args[1]), \
- RpcTypeTrait<T3>::parse(args[2]), \
- RpcTypeTrait<T4>::parse(args[3]) \
- ); \
- return true; \
-}
-
-#define TOOLS_RPC_DISPATCH5(Method, T1, T2, T3, T4, T5) \
-if (methodName == #Method) { \
- delegate->Method( \
- RpcTypeTrait<T1>::parse(args[0]), \
- RpcTypeTrait<T2>::parse(args[1]), \
- RpcTypeTrait<T3>::parse(args[2]), \
- RpcTypeTrait<T4>::parse(args[3]), \
- RpcTypeTrait<T5>::parse(args[4]) \
- ); \
- return true; \
-}
-
-#define TOOLS_END_RPC_DISPATCH() \
-}
-
-// This macro defines three classes: Class with the Api, ClassStub that is
-// serializing method calls and ClassDispatch that is capable of dispatching
-// the serialized message into its delegate.
-#define DEFINE_RPC_CLASS(Class, STRUCT) \
-class Class : public Noncopyable {\
-public: \
- Class() \
- { \
- m_className = #Class; \
- } \
- virtual ~Class() { } \
- \
- STRUCT( \
- TOOLS_RPC_API_METHOD0, \
- TOOLS_RPC_API_METHOD1, \
- TOOLS_RPC_API_METHOD2, \
- TOOLS_RPC_API_METHOD3, \
- TOOLS_RPC_API_METHOD4, \
- TOOLS_RPC_API_METHOD5) \
- WebCore::String m_className; \
-}; \
-\
-class Class##Stub \
- : public Class \
- , public DevToolsRPC { \
-public: \
- explicit Class##Stub(Delegate* delegate) : DevToolsRPC(delegate) { } \
- virtual ~Class##Stub() { } \
- typedef Class CLASS; \
- STRUCT( \
- TOOLS_RPC_STUB_METHOD0, \
- TOOLS_RPC_STUB_METHOD1, \
- TOOLS_RPC_STUB_METHOD2, \
- TOOLS_RPC_STUB_METHOD3, \
- TOOLS_RPC_STUB_METHOD4, \
- TOOLS_RPC_STUB_METHOD5) \
-}; \
-\
-class Class##Dispatch : public Noncopyable { \
-public: \
- Class##Dispatch() { } \
- virtual ~Class##Dispatch() { } \
- \
- static bool dispatch(Class* delegate, \
- const WebKit::WebDevToolsMessageData& data) { \
- String className = data.className; \
- if (className != #Class) \
- return false; \
- String methodName = data.methodName; \
- Vector<String> args; \
- for (size_t i = 0; i < data.arguments.size(); i++) \
- args.append(data.arguments[i]); \
- typedef Class CLASS; \
- STRUCT( \
- TOOLS_RPC_DISPATCH0, \
- TOOLS_RPC_DISPATCH1, \
- TOOLS_RPC_DISPATCH2, \
- TOOLS_RPC_DISPATCH3, \
- TOOLS_RPC_DISPATCH4, \
- TOOLS_RPC_DISPATCH5) \
- return false; \
- } \
-};
-
-///////////////////////////////////////////////////////
-// RPC base class
-class DevToolsRPC {
-public:
- class Delegate {
- public:
- Delegate() { }
- virtual ~Delegate() { }
- virtual void sendRpcMessage(const WebKit::WebDevToolsMessageData& data) = 0;
- };
-
- explicit DevToolsRPC(Delegate* delegate) : m_delegate(delegate) { }
- virtual ~DevToolsRPC() { };
-
-protected:
- void sendRpcMessage(const String& className,
- const String& methodName,
- const Vector<String>& args) {
- WebKit::WebVector<WebKit::WebString> webArgs(args.size());
- for (size_t i = 0; i < args.size(); i++)
- webArgs[i] = args[i];
- WebKit::WebDevToolsMessageData data;
- data.className = className;
- data.methodName = methodName;
- data.arguments.swap(webArgs);
- this->m_delegate->sendRpcMessage(data);
- }
-
- Delegate* m_delegate;
-};
-
-} // namespace WebKit
-
-#endif
diff --git a/WebKit/chromium/src/DevToolsRPCJS.h b/WebKit/chromium/src/DevToolsRPCJS.h
deleted file mode 100644
index 8ae279f..0000000
--- a/WebKit/chromium/src/DevToolsRPCJS.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-// Additional set of macros for the JS RPC.
-
-#ifndef DevToolsRPCJS_h
-#define DevToolsRPCJS_h
-
-// Do not remove this one although it is not used.
-#include "BoundObject.h"
-#include "DevToolsRPC.h"
-#include "WebFrame.h"
-#include <wtf/Noncopyable.h>
-#include <wtf/OwnPtr.h>
-
-namespace WebKit {
-
-///////////////////////////////////////////////////////
-// JS RPC binds and stubs
-
-#define TOOLS_RPC_JS_BIND_METHOD0(Method) \
- boundObj.addProtoFunction(#Method, OCLASS::js##Method);
-
-#define TOOLS_RPC_JS_BIND_METHOD1(Method, T1) \
- boundObj.addProtoFunction(#Method, OCLASS::js##Method);
-
-#define TOOLS_RPC_JS_BIND_METHOD2(Method, T1, T2) \
- boundObj.addProtoFunction(#Method, OCLASS::js##Method);
-
-#define TOOLS_RPC_JS_BIND_METHOD3(Method, T1, T2, T3) \
- boundObj.addProtoFunction(#Method, OCLASS::js##Method);
-
-#define TOOLS_RPC_JS_BIND_METHOD4(Method, T1, T2, T3, T4) \
- boundObj.addProtoFunction(#Method, OCLASS::js##Method);
-
-#define TOOLS_RPC_JS_BIND_METHOD5(Method, T1, T2, T3, T4, T5) \
- boundObj.addProtoFunction(#Method, OCLASS::js##Method);
-
-#define TOOLS_RPC_JS_STUB_METHOD0(Method) \
- static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \
- sendRpcMessageFromJS(#Method, args, 0); \
- return v8::Undefined(); \
- }
-
-#define TOOLS_RPC_JS_STUB_METHOD1(Method, T1) \
- static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \
- sendRpcMessageFromJS(#Method, args, 1); \
- return v8::Undefined(); \
- }
-
-#define TOOLS_RPC_JS_STUB_METHOD2(Method, T1, T2) \
- static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \
- sendRpcMessageFromJS(#Method, args, 2); \
- return v8::Undefined(); \
- }
-
-#define TOOLS_RPC_JS_STUB_METHOD3(Method, T1, T2, T3) \
- static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \
- sendRpcMessageFromJS(#Method, args, 3); \
- return v8::Undefined(); \
- }
-
-#define TOOLS_RPC_JS_STUB_METHOD4(Method, T1, T2, T3, T4) \
- static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \
- sendRpcMessageFromJS(#Method, args, 4); \
- return v8::Undefined(); \
- }
-
-#define TOOLS_RPC_JS_STUB_METHOD5(Method, T1, T2, T3, T4, T5) \
- static v8::Handle<v8::Value> js##Method(const v8::Arguments& args) { \
- sendRpcMessageFromJS(#Method, args, 5); \
- return v8::Undefined(); \
- }
-
-///////////////////////////////////////////////////////
-// JS RPC main obj macro
-
-#define DEFINE_RPC_JS_BOUND_OBJ(Class, STRUCT, DClass, DELEGATE_STRUCT) \
-class JS##Class##BoundObj : public Class##Stub { \
-public: \
- JS##Class##BoundObj(Delegate* rpcDelegate, \
- v8::Handle<v8::Context> context, \
- const char* classname) \
- : Class##Stub(rpcDelegate) { \
- BoundObject boundObj(context, this, classname); \
- STRUCT( \
- TOOLS_RPC_JS_BIND_METHOD0, \
- TOOLS_RPC_JS_BIND_METHOD1, \
- TOOLS_RPC_JS_BIND_METHOD2, \
- TOOLS_RPC_JS_BIND_METHOD3, \
- TOOLS_RPC_JS_BIND_METHOD4, \
- TOOLS_RPC_JS_BIND_METHOD5) \
- boundObj.build(); \
- } \
- virtual ~JS##Class##BoundObj() { } \
- typedef JS##Class##BoundObj OCLASS; \
- STRUCT( \
- TOOLS_RPC_JS_STUB_METHOD0, \
- TOOLS_RPC_JS_STUB_METHOD1, \
- TOOLS_RPC_JS_STUB_METHOD2, \
- TOOLS_RPC_JS_STUB_METHOD3, \
- TOOLS_RPC_JS_STUB_METHOD4, \
- TOOLS_RPC_JS_STUB_METHOD5) \
-private: \
- static void sendRpcMessageFromJS(const char* method, \
- const v8::Arguments& jsArguments, \
- size_t argsCount) \
- { \
- Vector<String> args(argsCount); \
- for (size_t i = 0; i < argsCount; i++) \
- args[i] = WebCore::toWebCoreStringWithNullCheck(jsArguments[i]); \
- void* selfPtr = v8::External::Cast(*jsArguments.Data())->Value(); \
- JS##Class##BoundObj* self = static_cast<JS##Class##BoundObj*>(selfPtr); \
- self->sendRpcMessage(#Class, method, args); \
- } \
-};
-
-} // namespace WebKit
-
-#endif
diff --git a/WebKit/chromium/src/DeviceOrientationClientProxy.cpp b/WebKit/chromium/src/DeviceOrientationClientProxy.cpp
new file mode 100644
index 0000000..29b43ba
--- /dev/null
+++ b/WebKit/chromium/src/DeviceOrientationClientProxy.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "DeviceOrientationClientProxy.h"
+
+#include "DeviceOrientation.h"
+#include "WebDeviceOrientation.h"
+#include "WebDeviceOrientationController.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+class DeviceOrientationController;
+}
+
+namespace WebKit {
+
+void DeviceOrientationClientProxy::setController(WebCore::DeviceOrientationController* c)
+{
+ if (!m_client) // FIXME: Get rid of these null checks once device orientation is enabled by default.
+ return;
+ m_client->setController(new WebDeviceOrientationController(c));
+}
+
+void DeviceOrientationClientProxy::startUpdating()
+{
+ if (!m_client)
+ return;
+ m_client->startUpdating();
+}
+
+void DeviceOrientationClientProxy::stopUpdating()
+{
+ if (!m_client)
+ return;
+ m_client->stopUpdating();
+}
+
+WebCore::DeviceOrientation* DeviceOrientationClientProxy::lastOrientation() const
+{
+ if (!m_client)
+ return 0;
+
+ // Cache the DeviceOrientation pointer so its reference count does not drop to zero upon return.
+ m_lastOrientation = m_client->lastOrientation();
+
+ return m_lastOrientation.get();
+}
+
+void DeviceOrientationClientProxy::deviceOrientationControllerDestroyed()
+{
+ // Our lifetime is bound to the WebViewImpl.
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/DeviceOrientationClientProxy.h b/WebKit/chromium/src/DeviceOrientationClientProxy.h
new file mode 100644
index 0000000..e90d77f
--- /dev/null
+++ b/WebKit/chromium/src/DeviceOrientationClientProxy.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef DeviceOrientationClientProxy_h
+#define DeviceOrientationClientProxy_h
+
+#include "DeviceOrientation.h"
+#include "DeviceOrientationClient.h"
+#include "WebDeviceOrientationClient.h"
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+class DeviceOrientationController;
+}
+
+namespace WebKit {
+
+class DeviceOrientationClientProxy : public WebCore::DeviceOrientationClient {
+public:
+ DeviceOrientationClientProxy(WebDeviceOrientationClient* client)
+ : m_client(client)
+ {
+ }
+
+ void setController(WebCore::DeviceOrientationController*);
+ void startUpdating();
+ void stopUpdating();
+ WebCore::DeviceOrientation* lastOrientation() const;
+ virtual void deviceOrientationControllerDestroyed();
+
+private:
+ WebDeviceOrientationClient* m_client;
+ mutable RefPtr<WebCore::DeviceOrientation> m_lastOrientation;
+};
+
+} // namespace WebKit
+
+#endif // DeviceOrientationClientProxy_h
diff --git a/WebKit/chromium/src/DragClientImpl.cpp b/WebKit/chromium/src/DragClientImpl.cpp
index 671e7ca..9874401 100644
--- a/WebKit/chromium/src/DragClientImpl.cpp
+++ b/WebKit/chromium/src/DragClientImpl.cpp
@@ -30,11 +30,14 @@
#include "config.h"
#include "DragClientImpl.h"
-
+#include "DragImageRef.h"
#include "ChromiumDataObject.h"
#include "ClipboardChromium.h"
#include "Frame.h"
+#include "NativeImageSkia.h"
+#include "WebCommon.h"
#include "WebDragData.h"
+#include "WebImage.h"
#include "WebViewClient.h"
#include "WebViewImpl.h"
@@ -81,8 +84,16 @@ void DragClientImpl::startDrag(DragImageRef dragImage,
DragOperation dragOperationMask = clipboard->sourceOperation();
+ IntSize offsetSize(eventPos - dragImageOrigin);
+ WebPoint offsetPoint(offsetSize.width(), offsetSize.height());
m_webView->startDragging(
- eventPos, dragData, static_cast<WebDragOperationsMask>(dragOperationMask));
+ dragData, static_cast<WebDragOperationsMask>(dragOperationMask),
+#if WEBKIT_USING_SKIA
+ dragImage ? WebImage(*dragImage) : WebImage(),
+#else
+ dragImage ? WebImage(dragImage) : WebImage(),
+#endif
+ offsetPoint);
}
DragImageRef DragClientImpl::createDragImageForLink(KURL&, const String& label, Frame*)
diff --git a/WebKit/chromium/src/DragClientImpl.h b/WebKit/chromium/src/DragClientImpl.h
index fc4c608..dac7acd 100644
--- a/WebKit/chromium/src/DragClientImpl.h
+++ b/WebKit/chromium/src/DragClientImpl.h
@@ -63,7 +63,7 @@ public:
WebCore::Frame* frame,
bool isLinkDrag = false);
virtual WebCore::DragImageRef createDragImageForLink(
- WebCore::KURL&, const WebCore::String& label, WebCore::Frame*);
+ WebCore::KURL&, const WTF::String& label, WebCore::Frame*);
virtual void dragControllerDestroyed();
private:
diff --git a/WebKit/chromium/src/DragScrollTimer.cpp b/WebKit/chromium/src/DragScrollTimer.cpp
new file mode 100644
index 0000000..83b81b7
--- /dev/null
+++ b/WebKit/chromium/src/DragScrollTimer.cpp
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "DragScrollTimer.h"
+
+#include "FrameView.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+// Computes the distance from a point outside a rect to the nearest edge of the rect.
+static IntSize distanceToRect(const IntPoint& point, const IntRect& rect)
+{
+ int dx = 0, dy = 0;
+ if (point.x() < rect.x())
+ dx = point.x() - rect.x();
+ else if (rect.right() < point.x())
+ dx = point.x() - rect.right();
+ if (point.y() < rect.y())
+ dy = point.y() - rect.y();
+ else if (rect.bottom() < point.y())
+ dy = point.y() - rect.bottom();
+ return IntSize(dx, dy);
+}
+
+DragScrollTimer::DragScrollTimer()
+ : m_timer(this, &DragScrollTimer::fired)
+ , m_view(0)
+ , m_scrolling(false)
+{
+}
+
+DragScrollTimer::~DragScrollTimer()
+{
+ // We do this for detecting dead object earlier
+ stop();
+}
+
+void DragScrollTimer::stop()
+{
+ m_timer.stop();
+ m_view = 0;
+ m_scrolling = false;
+}
+
+void DragScrollTimer::scroll()
+{
+ m_view->scrollBy(m_lastDistance);
+ m_scrolling = true;
+}
+
+void DragScrollTimer::update()
+{
+ if (shouldScroll())
+ scroll();
+ else
+ stop();
+}
+
+void DragScrollTimer::triggerScroll(FrameView* view, const WebPoint& location)
+{
+ if (!view)
+ return;
+
+ // Approximates Safari
+ static const double scrollStartDelay = 0.2;
+
+ m_view = view;
+ m_lastDistance = scrollDistanceFor(view, location);
+
+ if (m_scrolling)
+ update();
+ else if (shouldScroll() && !m_timer.isActive())
+ m_timer.startOneShot(scrollStartDelay);
+}
+
+IntSize DragScrollTimer::scrollDistanceFor(FrameView* view, const WebPoint& location) const
+{
+ static const int scrollMargin = 30;
+
+ IntRect bounds(0, 0, view->visibleWidth(), view->visibleHeight());
+ if (!bounds.contains(location))
+ return IntSize(0, 0); // The location is outside the border belt.
+
+ bounds.setY(bounds.y() + scrollMargin);
+ bounds.setHeight(bounds.height() - scrollMargin * 2);
+ bounds.setX(bounds.x() + scrollMargin);
+ bounds.setWidth(bounds.width() - scrollMargin * 2);
+
+ if (bounds.contains(location))
+ return IntSize(0, 0); // The location is inside the border belt.
+
+ // The location is over the border belt.
+ return distanceToRect(location, bounds);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/DragScrollTimer.h b/WebKit/chromium/src/DragScrollTimer.h
new file mode 100644
index 0000000..a4090e0
--- /dev/null
+++ b/WebKit/chromium/src/DragScrollTimer.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef DragScrollTimer_h
+#define DragScrollTimer_h
+
+#include "IntSize.h"
+#include "Timer.h"
+#include "WebPoint.h"
+
+namespace WebCore { class FrameView; }
+
+namespace WebKit {
+
+//
+// Encapsulating a timer and associated state management for
+// scroll-on-drag behaviour.
+//
+class DragScrollTimer {
+public:
+ DragScrollTimer();
+ ~DragScrollTimer();
+
+ void fired(WebCore::Timer<DragScrollTimer>*) { update(); }
+ void triggerScroll(WebCore::FrameView*, const WebPoint&);
+ void stop();
+
+private:
+ void scroll();
+ void update();
+ WebCore::IntSize scrollDistanceFor(WebCore::FrameView*, const WebPoint&) const;
+ bool shouldScroll() const { return !m_lastDistance.isZero(); }
+
+ WebCore::Timer<DragScrollTimer> m_timer;
+ WebCore::FrameView* m_view;
+ WebCore::IntSize m_lastDistance;
+ bool m_scrolling;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/WebKit/chromium/src/EditorClientImpl.cpp b/WebKit/chromium/src/EditorClientImpl.cpp
index d5bddc5..bc1d206 100644
--- a/WebKit/chromium/src/EditorClientImpl.cpp
+++ b/WebKit/chromium/src/EditorClientImpl.cpp
@@ -43,9 +43,11 @@
#include "DOMUtilitiesPrivate.h"
#include "WebEditingAction.h"
+#include "WebElement.h"
#include "WebFrameImpl.h"
#include "WebKit.h"
#include "WebInputElement.h"
+#include "WebInputEventConversion.h"
#include "WebNode.h"
#include "WebPasswordAutocompleteListener.h"
#include "WebRange.h"
@@ -90,7 +92,7 @@ bool EditorClientImpl::shouldShowDeleteInterface(HTMLElement* elem)
// Normally, we don't care to show WebCore's deletion UI, so we only enable
// it if in testing mode and the test specifically requests it by using this
// magic class name.
- return WebKit::layoutTestMode()
+ return layoutTestMode()
&& elem->getAttribute(HTMLNames::classAttr) == "needsDeletionUI";
}
@@ -122,7 +124,7 @@ bool EditorClientImpl::shouldSpellcheckByDefault()
const Editor* editor = frame->editor();
if (!editor)
return false;
- if (editor->spellCheckingEnabledInFocusedNode())
+ if (editor->isSpellCheckingEnabledInFocusedNode())
return true;
const Document* document = frame->document();
if (!document)
@@ -413,8 +415,10 @@ static const KeyDownEntry keyDownEntries[] = {
{ VKEY_DOWN, 0, "MoveDown" },
{ VKEY_DOWN, ShiftKey, "MoveDownAndModifySelection" },
{ VKEY_NEXT, ShiftKey, "MovePageDownAndModifySelection" },
+#if !OS(DARWIN)
{ VKEY_PRIOR, 0, "MovePageUp" },
{ VKEY_NEXT, 0, "MovePageDown" },
+#endif
{ VKEY_HOME, 0, "MoveToBeginningOfLine" },
{ VKEY_HOME, ShiftKey,
"MoveToBeginningOfLineAndModifySelection" },
@@ -422,6 +426,8 @@ static const KeyDownEntry keyDownEntries[] = {
{ VKEY_LEFT, CommandKey, "MoveToBeginningOfLine" },
{ VKEY_LEFT, CommandKey | ShiftKey,
"MoveToBeginningOfLineAndModifySelection" },
+ { VKEY_PRIOR, OptionKey, "MovePageUp" },
+ { VKEY_NEXT, OptionKey, "MovePageDown" },
#endif
#if OS(DARWIN)
{ VKEY_UP, CommandKey, "MoveToBeginningOfDocument" },
@@ -640,12 +646,19 @@ void EditorClientImpl::handleInputMethodKeydown(KeyboardEvent* keyEvent)
// We handle IME within chrome.
}
-void EditorClientImpl::textFieldDidBeginEditing(Element*)
+void EditorClientImpl::textFieldDidBeginEditing(Element* element)
{
+ HTMLInputElement* inputElement = toHTMLInputElement(element);
+ if (m_webView->client() && inputElement)
+ m_webView->client()->textFieldDidBeginEditing(WebInputElement(inputElement));
}
void EditorClientImpl::textFieldDidEndEditing(Element* element)
{
+ HTMLInputElement* inputElement = toHTMLInputElement(element);
+ if (m_webView->client() && inputElement)
+ m_webView->client()->textFieldDidEndEditing(WebInputElement(inputElement));
+
// Notification that focus was lost. Be careful with this, it's also sent
// when the page is being closed.
@@ -654,13 +667,12 @@ void EditorClientImpl::textFieldDidEndEditing(Element* element)
m_autofillTimer.stop();
// Hide any showing popup.
- m_webView->hideSuggestionsPopup();
+ m_webView->hideAutoFillPopup();
if (!m_webView->client())
return; // The page is getting closed, don't fill the password.
// Notify any password-listener of the focus change.
- HTMLInputElement* inputElement = WebKit::toHTMLInputElement(element);
if (!inputElement)
return;
@@ -678,15 +690,18 @@ void EditorClientImpl::textFieldDidEndEditing(Element* element)
void EditorClientImpl::textDidChangeInTextField(Element* element)
{
ASSERT(element->hasLocalName(HTMLNames::inputTag));
+ HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(element);
+ if (m_webView->client())
+ m_webView->client()->textFieldDidChange(WebInputElement(inputElement));
+
// Note that we only show the autofill popup in this case if the caret is at
// the end. This matches FireFox and Safari but not IE.
- autofill(static_cast<HTMLInputElement*>(element), false, false,
- true);
+ autofill(inputElement, false, false, true);
}
bool EditorClientImpl::showFormAutofillForNode(Node* node)
{
- HTMLInputElement* inputElement = WebKit::toHTMLInputElement(node);
+ HTMLInputElement* inputElement = toHTMLInputElement(node);
if (inputElement)
return autofill(inputElement, true, true, false);
return false;
@@ -701,10 +716,12 @@ bool EditorClientImpl::autofill(HTMLInputElement* inputElement,
m_autofillArgs.clear();
m_autofillTimer.stop();
+ // FIXME: Remove the extraneous isEnabledFormControl call below.
// Let's try to trigger autofill for that field, if applicable.
if (!inputElement->isEnabledFormControl() || !inputElement->isTextField()
- || inputElement->isPasswordField()
- || !inputElement->autoComplete())
+ || inputElement->isPasswordField() || !inputElement->autoComplete()
+ || !inputElement->isEnabledFormControl()
+ || inputElement->isReadOnlyFormControl())
return false;
WebString name = WebInputElement(inputElement).nameForAutofill();
@@ -748,7 +765,7 @@ void EditorClientImpl::doAutofill(Timer<EditorClientImpl>* timer)
&& inputElement->selectionEnd() == static_cast<int>(value.length());
if ((!args->autofillOnEmptyValue && value.isEmpty()) || !isCaretAtEnd) {
- m_webView->hideSuggestionsPopup();
+ m_webView->hideAutoFillPopup();
return;
}
@@ -784,22 +801,27 @@ void EditorClientImpl::cancelPendingAutofill()
m_autofillTimer.stop();
}
-void EditorClientImpl::onAutofillSuggestionAccepted(HTMLInputElement* textField)
+void EditorClientImpl::onAutocompleteSuggestionAccepted(HTMLInputElement* textField)
{
+ if (m_webView->client())
+ m_webView->client()->didAcceptAutocompleteSuggestion(WebInputElement(textField));
+
WebFrameImpl* webframe = WebFrameImpl::fromFrame(textField->document()->frame());
if (!webframe)
return;
- WebPasswordAutocompleteListener* listener = webframe->getPasswordListener(textField);
- // Password listeners need to autocomplete other fields that depend on the
- // input element with autofill suggestions.
- if (listener)
- listener->performInlineAutocomplete(textField->value(), false, false);
+ webframe->notifiyPasswordListenerOfAutocomplete(WebInputElement(textField));
}
bool EditorClientImpl::doTextFieldCommandFromEvent(Element* element,
KeyboardEvent* event)
{
+ HTMLInputElement* inputElement = toHTMLInputElement(element);
+ if (m_webView->client() && inputElement) {
+ m_webView->client()->textFieldDidReceiveKeyDown(WebInputElement(inputElement),
+ WebKeyboardEventBuilder(*event));
+ }
+
// Remember if backspace was pressed for the autofill. It is not clear how to
// find if backspace was pressed from textFieldDidBeginEditing and
// textDidChangeInTextField as when these methods are called the value of the
@@ -913,10 +935,14 @@ void EditorClientImpl::getGuessesForWord(const String&,
notImplemented();
}
-void EditorClientImpl::setInputMethodState(bool enabled)
+void EditorClientImpl::willSetInputMethodState()
{
if (m_webView->client())
- m_webView->client()->setInputMethodEnabled(enabled);
+ m_webView->client()->resetInputMethod();
+}
+
+void EditorClientImpl::setInputMethodState(bool)
+{
}
} // namesace WebKit
diff --git a/WebKit/chromium/src/EditorClientImpl.h b/WebKit/chromium/src/EditorClientImpl.h
index fd08b4d..b05a592 100644
--- a/WebKit/chromium/src/EditorClientImpl.h
+++ b/WebKit/chromium/src/EditorClientImpl.h
@@ -61,7 +61,7 @@ public:
virtual bool shouldBeginEditing(WebCore::Range*);
virtual bool shouldEndEditing(WebCore::Range*);
virtual bool shouldInsertNode(WebCore::Node*, WebCore::Range*, WebCore::EditorInsertAction);
- virtual bool shouldInsertText(const WebCore::String&, WebCore::Range*, WebCore::EditorInsertAction);
+ virtual bool shouldInsertText(const WTF::String&, WebCore::Range*, WebCore::EditorInsertAction);
virtual bool shouldDeleteRange(WebCore::Range*);
virtual bool shouldChangeSelectedRange(WebCore::Range* fromRange,
WebCore::Range* toRange,
@@ -92,8 +92,8 @@ public:
virtual bool doTextFieldCommandFromEvent(WebCore::Element*, WebCore::KeyboardEvent*);
virtual void textWillBeDeletedInTextField(WebCore::Element*);
virtual void textDidChangeInTextArea(WebCore::Element*);
- virtual void ignoreWordInSpellDocument(const WebCore::String&);
- virtual void learnWord(const WebCore::String&);
+ virtual void ignoreWordInSpellDocument(const WTF::String&);
+ virtual void learnWord(const WTF::String&);
virtual void checkSpellingOfString(const UChar*, int length,
int* misspellingLocation,
int* misspellingLength);
@@ -101,13 +101,14 @@ public:
WTF::Vector<WebCore::GrammarDetail>&,
int* badGrammarLocation,
int* badGrammarLength);
- virtual WebCore::String getAutoCorrectSuggestionForMisspelledWord(const WebCore::String&);
- virtual void updateSpellingUIWithGrammarString(const WebCore::String&, const WebCore::GrammarDetail&);
- virtual void updateSpellingUIWithMisspelledWord(const WebCore::String&);
+ virtual WTF::String getAutoCorrectSuggestionForMisspelledWord(const WTF::String&);
+ virtual void updateSpellingUIWithGrammarString(const WTF::String&, const WebCore::GrammarDetail&);
+ virtual void updateSpellingUIWithMisspelledWord(const WTF::String&);
virtual void showSpellingUI(bool show);
virtual bool spellingUIIsShowing();
- virtual void getGuessesForWord(const WebCore::String& word,
- WTF::Vector<WebCore::String>& guesses);
+ virtual void getGuessesForWord(const WTF::String& word,
+ WTF::Vector<WTF::String>& guesses);
+ virtual void willSetInputMethodState();
virtual void setInputMethodState(bool enabled);
// Shows the form autofill popup for |node| if it is an HTMLInputElement and
@@ -118,10 +119,10 @@ public:
virtual bool showFormAutofillForNode(WebCore::Node*);
// Notification that the text changed due to acceptance of a suggestion
- // provided by an autofill popup. Having a separate callback in this case
- // is a simple way to break the cycle that would otherwise occur if
+ // provided by an Autocomplete popup. Having a separate callback in this
+ // case is a simple way to break the cycle that would otherwise occur if
// textDidChangeInTextField was called.
- virtual void onAutofillSuggestionAccepted(WebCore::HTMLInputElement*);
+ virtual void onAutocompleteSuggestionAccepted(WebCore::HTMLInputElement*);
private:
void modifySelection(WebCore::Frame*, WebCore::KeyboardEvent*);
diff --git a/WebKit/chromium/src/EventListenerWrapper.cpp b/WebKit/chromium/src/EventListenerWrapper.cpp
index f2d2979..6360932 100644
--- a/WebKit/chromium/src/EventListenerWrapper.cpp
+++ b/WebKit/chromium/src/EventListenerWrapper.cpp
@@ -1,72 +1,72 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#include "config.h"
-#include "EventListenerWrapper.h"
-
-#include "Event.h"
-#include "EventListener.h"
-
-#include "WebEvent.h"
-#include "WebEventListener.h"
-
-namespace WebKit {
-
-EventListenerWrapper::EventListenerWrapper(WebEventListener* webEventListener)
- : EventListener(EventListener::JSEventListenerType)
- , m_webEventListener(webEventListener)
-{
-}
-
-EventListenerWrapper::~EventListenerWrapper()
-{
- if (m_webEventListener)
- m_webEventListener->notifyEventListenerDeleted(this);
-}
-
-bool EventListenerWrapper::operator==(const EventListener& listener)
-{
- return this == &listener;
-}
-
-void EventListenerWrapper::handleEvent(ScriptExecutionContext* context, Event* event)
-{
- if (!m_webEventListener)
- return;
- WebEvent webEvent(event);
- m_webEventListener->handleEvent(webEvent);
-}
-
-void EventListenerWrapper::webEventListenerDeleted()
-{
- m_webEventListener = 0;
-}
-
-} // namespace WebKit
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "EventListenerWrapper.h"
+
+#include "Event.h"
+#include "EventListener.h"
+
+#include "WebDOMEvent.h"
+#include "WebDOMEventListener.h"
+
+namespace WebKit {
+
+EventListenerWrapper::EventListenerWrapper(WebDOMEventListener* webDOMEventListener)
+ : EventListener(EventListener::NativeEventListenerType)
+ , m_webDOMEventListener(webDOMEventListener)
+{
+}
+
+EventListenerWrapper::~EventListenerWrapper()
+{
+ if (m_webDOMEventListener)
+ m_webDOMEventListener->notifyEventListenerDeleted(this);
+}
+
+bool EventListenerWrapper::operator==(const EventListener& listener)
+{
+ return this == &listener;
+}
+
+void EventListenerWrapper::handleEvent(ScriptExecutionContext* context, Event* event)
+{
+ if (!m_webDOMEventListener)
+ return;
+ WebDOMEvent webDOMEvent(event);
+ m_webDOMEventListener->handleEvent(webDOMEvent);
+}
+
+void EventListenerWrapper::webDOMEventListenerDeleted()
+{
+ m_webDOMEventListener = 0;
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/EventListenerWrapper.h b/WebKit/chromium/src/EventListenerWrapper.h
index 2a0cbbb..75b6a95 100644
--- a/WebKit/chromium/src/EventListenerWrapper.h
+++ b/WebKit/chromium/src/EventListenerWrapper.h
@@ -1,62 +1,64 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#ifndef EventListenerWrapper_h
-#define EventListenerWrapper_h
-
-#include "EventListener.h"
-
-namespace WebCore {
-class ScriptExecutionContext;
-}
-
-using namespace WebCore;
-
-namespace WebKit {
-
-class WebEventListener;
-
-class EventListenerWrapper : public EventListener {
-public:
- EventListenerWrapper(WebEventListener*);
- ~EventListenerWrapper();
-
- virtual bool operator==(const EventListener&);
- virtual void handleEvent(ScriptExecutionContext*, Event*);
-
- void webEventListenerDeleted();
-
-private:
- WebEventListener* m_webEventListener;
-};
-
-} // namespace WebKit
-
-#endif
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef EventListenerWrapper_h
+#define EventListenerWrapper_h
+
+#include "EventListener.h"
+
+namespace WebCore {
+class ScriptExecutionContext;
+}
+
+using namespace WebCore;
+
+namespace WebKit {
+
+class WebDOMEventListener;
+
+// FIXME: Remove the DeprecatedEventListenerWrapper class below once Chromium
+// switched to using WebDOMEvent.
+class EventListenerWrapper : public EventListener {
+public:
+ EventListenerWrapper(WebDOMEventListener*);
+ ~EventListenerWrapper();
+
+ virtual bool operator==(const EventListener&);
+ virtual void handleEvent(ScriptExecutionContext*, Event*);
+
+ void webDOMEventListenerDeleted();
+
+private:
+ WebDOMEventListener* m_webDOMEventListener;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/WebKit/chromium/src/Extensions3DChromium.cpp b/WebKit/chromium/src/Extensions3DChromium.cpp
new file mode 100644
index 0000000..fe04986
--- /dev/null
+++ b/WebKit/chromium/src/Extensions3DChromium.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+
+#if ENABLE(3D_CANVAS)
+
+#include "Extensions3DChromium.h"
+
+#include "GraphicsContext3D.h"
+#include "GraphicsContext3DInternal.h"
+
+namespace WebCore {
+
+Extensions3DChromium::Extensions3DChromium(GraphicsContext3DInternal* internal)
+ : m_internal(internal)
+{
+}
+
+Extensions3DChromium::~Extensions3DChromium()
+{
+}
+
+bool Extensions3DChromium::supports(const String& name)
+{
+ return m_internal->supportsExtension(name);
+}
+
+int Extensions3DChromium::getGraphicsResetStatusARB()
+{
+ return m_internal->isContextLost() ? static_cast<int>(Extensions3D::UNKNOWN_CONTEXT_RESET_ARB) : static_cast<int>(GraphicsContext3D::NO_ERROR);
+}
+
+void* Extensions3DChromium::mapBufferSubDataCHROMIUM(unsigned target, int offset, int size, unsigned access)
+{
+ return m_internal->mapBufferSubDataCHROMIUM(target, offset, size, access);
+}
+
+void Extensions3DChromium::unmapBufferSubDataCHROMIUM(const void* data)
+{
+ m_internal->unmapBufferSubDataCHROMIUM(data);
+}
+
+void* Extensions3DChromium::mapTexSubImage2DCHROMIUM(unsigned target, int level, int xoffset, int yoffset, int width, int height, unsigned format, unsigned type, unsigned access)
+{
+ return m_internal->mapTexSubImage2DCHROMIUM(target, level, xoffset, yoffset, width, height, format, type, access);
+}
+
+void Extensions3DChromium::unmapTexSubImage2DCHROMIUM(const void* data)
+{
+ m_internal->unmapTexSubImage2DCHROMIUM(data);
+}
+
+void Extensions3DChromium::copyTextureToParentTextureCHROMIUM(unsigned texture, unsigned parentTexture)
+{
+ m_internal->copyTextureToParentTextureCHROMIUM(texture, parentTexture);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(3D_CANVAS)
diff --git a/WebKit/chromium/src/ExternalPopupMenu.cpp b/WebKit/chromium/src/ExternalPopupMenu.cpp
new file mode 100644
index 0000000..f7f9862
--- /dev/null
+++ b/WebKit/chromium/src/ExternalPopupMenu.cpp
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "ExternalPopupMenu.h"
+
+#include "FrameView.h"
+#include "IntPoint.h"
+#include "PopupMenuClient.h"
+#include "TextDirection.h"
+#include "WebExternalPopupMenu.h"
+#include "WebMenuItemInfo.h"
+#include "WebPopupMenuInfo.h"
+#include "WebVector.h"
+#include "WebViewClient.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+ExternalPopupMenu::ExternalPopupMenu(PopupMenuClient* popupMenuClient,
+ WebViewClient* webViewClient)
+ : m_popupMenuClient(popupMenuClient)
+ , m_webViewClient(webViewClient)
+ , m_webExternalPopupMenu(0)
+{
+}
+
+ExternalPopupMenu::~ExternalPopupMenu()
+{
+}
+
+void ExternalPopupMenu::show(const IntRect& rect, FrameView* v, int index)
+{
+ // WebCore reuses the PopupMenu of a page.
+ // For simplicity, we do recreate the actual external popup everytime.
+ hide();
+
+ WebPopupMenuInfo info;
+ getPopupMenuInfo(&info);
+ if (info.items.isEmpty())
+ return;
+ m_webExternalPopupMenu =
+ m_webViewClient->createExternalPopupMenu(info, this);
+ m_webExternalPopupMenu->show(v->contentsToWindow(rect));
+}
+
+void ExternalPopupMenu::hide()
+{
+ if (m_popupMenuClient)
+ m_popupMenuClient->popupDidHide();
+ if (!m_webExternalPopupMenu)
+ return;
+ m_webExternalPopupMenu->close();
+ m_webExternalPopupMenu = 0;
+}
+
+void ExternalPopupMenu::updateFromElement()
+{
+}
+
+void ExternalPopupMenu::disconnectClient()
+{
+ hide();
+ m_popupMenuClient = 0;
+}
+
+void ExternalPopupMenu::didChangeSelection(int index)
+{
+ if (m_popupMenuClient)
+ m_popupMenuClient->selectionChanged(index);
+}
+
+void ExternalPopupMenu::didAcceptIndex(int index)
+{
+ // Calling methods on the PopupMenuClient might lead to this object being
+ // derefed. This ensures it does not get deleted while we are running this
+ // method.
+ RefPtr<ExternalPopupMenu> guard(this);
+
+ if (m_popupMenuClient) {
+ m_popupMenuClient->valueChanged(index);
+ // The call to valueChanged above might have lead to a call to
+ // disconnectClient, so we might not have a PopupMenuClient anymore.
+ if (m_popupMenuClient)
+ m_popupMenuClient->popupDidHide();
+ }
+ m_webExternalPopupMenu = 0;
+}
+
+void ExternalPopupMenu::didCancel()
+{
+ // See comment in didAcceptIndex on why we need this.
+ RefPtr<ExternalPopupMenu> guard(this);
+
+ if (m_popupMenuClient)
+ m_popupMenuClient->popupDidHide();
+ m_webExternalPopupMenu = 0;
+}
+
+void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo* info)
+{
+ int itemCount = m_popupMenuClient->listSize();
+ WebVector<WebPopupMenuInfo::Item> items(
+ static_cast<size_t>(itemCount));
+ for (int i = 0; i < itemCount; ++i) {
+ WebPopupMenuInfo::Item& popupItem = items[i];
+ popupItem.label = m_popupMenuClient->itemText(i);
+ if (m_popupMenuClient->itemIsSeparator(i))
+ popupItem.type = WebMenuItemInfo::Separator;
+ else if (m_popupMenuClient->itemIsLabel(i))
+ popupItem.type = WebMenuItemInfo::Group;
+ else
+ popupItem.type = WebMenuItemInfo::Option;
+ popupItem.enabled = m_popupMenuClient->itemIsEnabled(i);
+ }
+
+ info->itemHeight = m_popupMenuClient->menuStyle().font().height();
+ info->itemFontSize =
+ static_cast<int>(m_popupMenuClient->menuStyle().font().size());
+ info->selectedIndex = m_popupMenuClient->selectedIndex();
+ info->rightAligned =
+ m_popupMenuClient->menuStyle().textDirection() == WebCore::RTL;
+ info->items.swap(items);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/ExternalPopupMenu.h b/WebKit/chromium/src/ExternalPopupMenu.h
new file mode 100644
index 0000000..6963e8d
--- /dev/null
+++ b/WebKit/chromium/src/ExternalPopupMenu.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef ExternalPopupMenu_h
+#define ExternalPopupMenu_h
+
+#include "PopupMenu.h"
+#include "WebExternalPopupMenuClient.h"
+
+namespace WebCore {
+class FrameView;
+class IntRect;
+class PopupMenuClient;
+}
+
+namespace WebKit {
+
+class WebExternalPopupMenu;
+class WebViewClient;
+struct WebPopupMenuInfo;
+
+// The ExternalPopupMenu connects the actual implementation of the popup menu
+// to the WebCore popup menu.
+class ExternalPopupMenu : public WebCore::PopupMenu,
+ public WebExternalPopupMenuClient {
+public:
+ ExternalPopupMenu(WebCore::PopupMenuClient*, WebViewClient*);
+ virtual ~ExternalPopupMenu();
+
+private:
+ // WebCore::PopupMenu methods:
+ virtual void show(const WebCore::IntRect&, WebCore::FrameView*, int index);
+ virtual void hide();
+ virtual void updateFromElement();
+ virtual void disconnectClient();
+
+ // WebExternalPopupClient methods:
+ virtual void didChangeSelection(int index);
+ virtual void didAcceptIndex(int index);
+ virtual void didCancel();
+
+ // Fills |info| with the popup menu information contained in the
+ // WebCore::PopupMenuClient associated with this ExternalPopupMenu.
+ void getPopupMenuInfo(WebPopupMenuInfo* info);
+
+ WebCore::PopupMenuClient* m_popupMenuClient;
+ WebViewClient* m_webViewClient;
+
+ // The actual implementor of the show menu.
+ WebExternalPopupMenu* m_webExternalPopupMenu;
+};
+
+} // namespace WebKit
+
+#endif // ExternalPopupMenu_h
diff --git a/WebKit/chromium/src/FrameLoaderClientImpl.cpp b/WebKit/chromium/src/FrameLoaderClientImpl.cpp
index b984308..9d79599 100644
--- a/WebKit/chromium/src/FrameLoaderClientImpl.cpp
+++ b/WebKit/chromium/src/FrameLoaderClientImpl.cpp
@@ -32,12 +32,15 @@
#include "FrameLoaderClientImpl.h"
#include "Chrome.h"
-#include "CString.h"
#include "Document.h"
#include "DocumentLoader.h"
#include "FormState.h"
#include "FrameLoader.h"
#include "FrameLoadRequest.h"
+#include "FrameNetworkingContextImpl.h"
+#include "FrameView.h"
+#include "HTTPParsers.h"
+#include "HistoryItem.h"
#include "HitTestResult.h"
#include "HTMLAppletElement.h"
#include "HTMLFormElement.h" // needed by FormState.h
@@ -48,6 +51,8 @@
#include "PlatformString.h"
#include "PluginData.h"
#include "PluginDataChromium.h"
+#include "ProgressTracker.h"
+#include "Settings.h"
#include "StringExtras.h"
#include "WebDataSourceImpl.h"
#include "WebDevToolsAgentPrivate.h"
@@ -71,6 +76,7 @@
#include "WindowFeatures.h"
#include "WrappedResourceRequest.h"
#include "WrappedResourceResponse.h"
+#include <wtf/text/CString.h>
using namespace WebCore;
@@ -142,6 +148,14 @@ void FrameLoaderClientImpl::didCreateIsolatedScriptContext()
m_webFrame->client()->didCreateIsolatedScriptContext(m_webFrame);
}
+bool FrameLoaderClientImpl::allowScriptExtension(const String& extensionName,
+ int extensionGroup)
+{
+ if (m_webFrame->client())
+ return m_webFrame->client()->allowScriptExtension(m_webFrame, extensionName, extensionGroup);
+ return false;
+}
+
void FrameLoaderClientImpl::didPerformFirstNavigation() const
{
}
@@ -180,6 +194,18 @@ bool FrameLoaderClientImpl::allowImages(bool enabledPerSettings)
return enabledPerSettings;
}
+void FrameLoaderClientImpl::didNotAllowScript()
+{
+ if (m_webFrame->client())
+ m_webFrame->client()->didNotAllowScript(m_webFrame);
+}
+
+void FrameLoaderClientImpl::didNotAllowPlugins()
+{
+ if (m_webFrame->client())
+ m_webFrame->client()->didNotAllowPlugins(m_webFrame);
+}
+
bool FrameLoaderClientImpl::hasWebView() const
{
return m_webFrame->viewImpl();
@@ -232,10 +258,15 @@ void FrameLoaderClientImpl::detachedFromParent3()
// go to a page and then navigate to a new page without getting any asserts
// or crashes.
m_webFrame->frame()->script()->proxy()->clearForClose();
-
+
+ // Alert the client that the frame is being detached. This is the last
+ // chance we have to communicate with the client.
+ if (m_webFrame->client())
+ m_webFrame->client()->frameDetached(m_webFrame);
+
// Stop communicating with the WebFrameClient at this point since we are no
// longer associated with the Page.
- m_webFrame->dropClient();
+ m_webFrame->setClient(0);
}
// This function is responsible for associating the |identifier| with a given
@@ -258,7 +289,7 @@ void FrameLoaderClientImpl::assignIdentifierToInitialRequest(
// this includes images and xmlhttp requests. It is important to note that a
// subresource is NOT limited to stuff loaded through the frame's subresource
// loader. Synchronous xmlhttp requests for example, do not go through the
-// subresource loader, but we still label them as TargetIsSubResource.
+// subresource loader, but we still label them as TargetIsSubresource.
//
// The important edge cases to consider when modifying this function are
// how synchronous resource loads are treated during load/unload threshold.
@@ -392,12 +423,6 @@ bool FrameLoaderClientImpl::dispatchDidLoadResourceFromMemoryCache(
return false; // Do not suppress remaining notifications
}
-void FrameLoaderClientImpl::dispatchDidLoadResourceByXMLHttpRequest(
- unsigned long identifier,
- const ScriptString& source)
-{
-}
-
void FrameLoaderClientImpl::dispatchDidHandleOnloadEvents()
{
if (m_webFrame->client())
@@ -556,7 +581,7 @@ void FrameLoaderClientImpl::dispatchWillPerformClientRedirect(
}
}
-void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage()
+void FrameLoaderClientImpl::dispatchDidNavigateWithinPage()
{
// Anchor fragment navigations are not normal loads, so we need to synthesize
// some events for our delegate.
@@ -567,12 +592,17 @@ void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage()
// them for fragment redirection that happens in window.onload handler.
// See https://bugs.webkit.org/show_bug.cgi?id=31838
bool loaderCompleted =
- !m_webFrame->frame()->page()->mainFrame()->loader()->isLoading();
+ !webView->page()->mainFrame()->loader()->activeDocumentLoader()->isLoadingInAPISense();
// Generate didStartLoading if loader is completed.
if (webView->client() && loaderCompleted)
webView->client()->didStartLoading();
+ // We need to classify some hash changes as client redirects.
+ // FIXME: It seems wrong that the currentItem can sometimes be null.
+ HistoryItem* currentItem = m_webFrame->frame()->loader()->history()->currentItem();
+ bool isHashChange = !currentItem || !currentItem->stateObject();
+
WebDataSourceImpl* ds = m_webFrame->dataSourceImpl();
ASSERT(ds); // Should not be null when navigating to a reference fragment!
if (ds) {
@@ -583,27 +613,29 @@ void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage()
ds->clearRedirectChain();
}
- // Figure out if this location change is because of a JS-initiated
- // client redirect (e.g onload/setTimeout document.location.href=).
- // FIXME: (bugs 1085325, 1046841) We don't get proper redirect
- // performed/cancelled notifications across anchor navigations, so the
- // other redirect-tracking code in this class (see
- // dispatch*ClientRedirect() and dispatchDidStartProvisionalLoad) is
- // insufficient to catch and properly flag these transitions. Once a
- // proper fix for this bug is identified and applied the following
- // block may no longer be required.
- bool wasClientRedirect =
- (url == m_expectedClientRedirectDest && chainEnd == m_expectedClientRedirectSrc)
- || !m_webFrame->isProcessingUserGesture();
-
- if (wasClientRedirect) {
- if (m_webFrame->client())
- m_webFrame->client()->didCompleteClientRedirect(m_webFrame, chainEnd);
- ds->appendRedirect(chainEnd);
- // Make sure we clear the expected redirect since we just effectively
- // completed it.
- m_expectedClientRedirectSrc = KURL();
- m_expectedClientRedirectDest = KURL();
+ if (isHashChange) {
+ // Figure out if this location change is because of a JS-initiated
+ // client redirect (e.g onload/setTimeout document.location.href=).
+ // FIXME: (b/1085325, b/1046841) We don't get proper redirect
+ // performed/cancelled notifications across anchor navigations, so the
+ // other redirect-tracking code in this class (see
+ // dispatch*ClientRedirect() and dispatchDidStartProvisionalLoad) is
+ // insufficient to catch and properly flag these transitions. Once a
+ // proper fix for this bug is identified and applied the following
+ // block may no longer be required.
+ bool wasClientRedirect =
+ (url == m_expectedClientRedirectDest && chainEnd == m_expectedClientRedirectSrc)
+ || !m_webFrame->isProcessingUserGesture();
+
+ if (wasClientRedirect) {
+ if (m_webFrame->client())
+ m_webFrame->client()->didCompleteClientRedirect(m_webFrame, chainEnd);
+ ds->appendRedirect(chainEnd);
+ // Make sure we clear the expected redirect since we just effectively
+ // completed it.
+ m_expectedClientRedirectSrc = KURL();
+ m_expectedClientRedirectDest = KURL();
+ }
}
// Regardless of how we got here, we are navigating to a URL so we need to
@@ -614,26 +646,32 @@ void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage()
bool isNewNavigation;
webView->didCommitLoad(&isNewNavigation);
if (m_webFrame->client())
- m_webFrame->client()->didChangeLocationWithinPage(m_webFrame, isNewNavigation);
+ m_webFrame->client()->didNavigateWithinPage(m_webFrame, isNewNavigation);
// Generate didStopLoading if loader is completed.
if (webView->client() && loaderCompleted)
webView->client()->didStopLoading();
}
+void FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage()
+{
+ if (m_webFrame)
+ m_webFrame->client()->didChangeLocationWithinPage(m_webFrame);
+}
+
void FrameLoaderClientImpl::dispatchDidPushStateWithinPage()
{
- // FIXME
+ dispatchDidNavigateWithinPage();
}
void FrameLoaderClientImpl::dispatchDidReplaceStateWithinPage()
{
- // FIXME
+ dispatchDidNavigateWithinPage();
}
void FrameLoaderClientImpl::dispatchDidPopStateWithinPage()
{
- // FIXME
+ // Ignored since dispatchDidNavigateWithinPage was already called.
}
void FrameLoaderClientImpl::dispatchWillClose()
@@ -700,6 +738,12 @@ void FrameLoaderClientImpl::dispatchDidReceiveTitle(const String& title)
m_webFrame->client()->didReceiveTitle(m_webFrame, title);
}
+void FrameLoaderClientImpl::dispatchDidChangeIcons()
+{
+ if (m_webFrame->client())
+ m_webFrame->client()->didChangeIcons(m_webFrame);
+}
+
void FrameLoaderClientImpl::dispatchDidCommitLoad()
{
WebViewImpl* webview = m_webFrame->viewImpl();
@@ -708,9 +752,6 @@ void FrameLoaderClientImpl::dispatchDidCommitLoad()
if (m_webFrame->client())
m_webFrame->client()->didCommitProvisionalLoad(m_webFrame, isNewNavigation);
-
- if (webview->devToolsAgentPrivate())
- webview->devToolsAgentPrivate()->didCommitProvisionalLoad(m_webFrame, isNewNavigation);
}
void FrameLoaderClientImpl::dispatchDidFailProvisionalLoad(
@@ -762,19 +803,21 @@ void FrameLoaderClientImpl::dispatchDidFinishLoad()
void FrameLoaderClientImpl::dispatchDidFirstLayout()
{
+ if (m_webFrame->client())
+ m_webFrame->client()->didFirstLayout(m_webFrame);
}
void FrameLoaderClientImpl::dispatchDidFirstVisuallyNonEmptyLayout()
{
- // FIXME: called when webkit finished layout of a page that was visually non-empty.
- // All resources have not necessarily finished loading.
+ if (m_webFrame->client())
+ m_webFrame->client()->didFirstVisuallyNonEmptyLayout(m_webFrame);
}
-Frame* FrameLoaderClientImpl::dispatchCreatePage()
+Frame* FrameLoaderClientImpl::dispatchCreatePage(const NavigationAction& action)
{
struct WindowFeatures features;
Page* newPage = m_webFrame->frame()->page()->chrome()->createWindow(
- m_webFrame->frame(), FrameLoadRequest(), features);
+ m_webFrame->frame(), FrameLoadRequest(), features, action);
// Make sure that we have a valid disposition. This should have been set in
// the preceeding call to dispatchDecidePolicyForNewWindowAction.
@@ -797,38 +840,6 @@ void FrameLoaderClientImpl::dispatchShow()
webView->client()->show(webView->initialNavigationPolicy());
}
-static bool shouldTreatAsAttachment(const ResourceResponse& response)
-{
- const String& contentDisposition =
- response.httpHeaderField("Content-Disposition");
- if (contentDisposition.isEmpty())
- return false;
-
- // Some broken sites just send
- // Content-Disposition: ; filename="file"
- // screen those out here.
- if (contentDisposition.startsWith(";"))
- return false;
-
- if (contentDisposition.startsWith("inline", false))
- return false;
-
- // Some broken sites just send
- // Content-Disposition: filename="file"
- // without a disposition token... screen those out.
- if (contentDisposition.startsWith("filename", false))
- return false;
-
- // Also in use is Content-Disposition: name="file"
- if (contentDisposition.startsWith("name", false))
- return false;
-
- // We have a content-disposition of "attachment" or unknown.
- // RFC 2183, section 2.8 says that an unknown disposition
- // value should be treated as "attachment"
- return true;
-}
-
void FrameLoaderClientImpl::dispatchDecidePolicyForMIMEType(
FramePolicyFunction function,
const String& mimeType,
@@ -843,7 +854,7 @@ void FrameLoaderClientImpl::dispatchDecidePolicyForMIMEType(
if (statusCode == 204 || statusCode == 205) {
// The server does not want us to replace the page contents.
action = PolicyIgnore;
- } else if (shouldTreatAsAttachment(response)) {
+ } else if (WebCore::contentDispositionType(response.httpHeaderField("Content-Disposition")) == WebCore::ContentDispositionAttachment) {
// The server wants us to download instead of replacing the page contents.
// Downloading is handled by the embedder, but we still get the initial
// response so that we can ignore it and clean up properly.
@@ -898,51 +909,48 @@ void FrameLoaderClientImpl::dispatchDecidePolicyForNavigationAction(
// The null check here is to fix a crash that seems strange
// (see - https://bugs.webkit.org/show_bug.cgi?id=23554).
if (m_webFrame->client() && !request.url().isNull()) {
- WebNavigationPolicy navigationPolicy = WebNavigationPolicyCurrentTab;
- actionSpecifiesNavigationPolicy(action, &navigationPolicy);
-
- // Give the delegate a chance to change the navigation policy.
- const WebDataSourceImpl* ds = m_webFrame->provisionalDataSourceImpl();
- if (ds) {
- KURL url = ds->request().url();
- if (url.protocolIs(backForwardNavigationScheme)) {
- handleBackForwardNavigation(url);
- navigationPolicy = WebNavigationPolicyIgnore;
- } else {
- bool isRedirect = ds->hasRedirectChain();
-
- WebNavigationType webnavType =
- WebDataSourceImpl::toWebNavigationType(action.type());
-
- RefPtr<Node> node;
- for (const Event* event = action.event(); event; event = event->underlyingEvent()) {
- if (event->isMouseEvent()) {
- const MouseEvent* mouseEvent =
- static_cast<const MouseEvent*>(event);
- node = m_webFrame->frame()->eventHandler()->hitTestResultAtPoint(
- mouseEvent->absoluteLocation(), false).innerNonSharedNode();
- break;
- }
- }
- WebNode originatingNode(node);
-
- navigationPolicy = m_webFrame->client()->decidePolicyForNavigation(
- m_webFrame, ds->request(), webnavType, originatingNode,
- navigationPolicy, isRedirect);
- }
- }
-
- if (navigationPolicy == WebNavigationPolicyCurrentTab)
- policyAction = PolicyUse;
- else if (navigationPolicy == WebNavigationPolicyDownload)
- policyAction = PolicyDownload;
- else {
- if (navigationPolicy != WebNavigationPolicyIgnore) {
- WrappedResourceRequest webreq(request);
- m_webFrame->client()->loadURLExternally(m_webFrame, webreq, navigationPolicy);
- }
- policyAction = PolicyIgnore;
- }
+ WebNavigationPolicy navigationPolicy = WebNavigationPolicyCurrentTab;
+ actionSpecifiesNavigationPolicy(action, &navigationPolicy);
+
+ // Give the delegate a chance to change the navigation policy.
+ const WebDataSourceImpl* ds = m_webFrame->provisionalDataSourceImpl();
+ if (ds) {
+ KURL url = ds->request().url();
+ ASSERT(!url.protocolIs(backForwardNavigationScheme));
+
+ bool isRedirect = ds->hasRedirectChain();
+
+ WebNavigationType webnavType =
+ WebDataSourceImpl::toWebNavigationType(action.type());
+
+ RefPtr<Node> node;
+ for (const Event* event = action.event(); event; event = event->underlyingEvent()) {
+ if (event->isMouseEvent()) {
+ const MouseEvent* mouseEvent =
+ static_cast<const MouseEvent*>(event);
+ node = m_webFrame->frame()->eventHandler()->hitTestResultAtPoint(
+ mouseEvent->absoluteLocation(), false).innerNonSharedNode();
+ break;
+ }
+ }
+ WebNode originatingNode(node);
+
+ navigationPolicy = m_webFrame->client()->decidePolicyForNavigation(
+ m_webFrame, ds->request(), webnavType, originatingNode,
+ navigationPolicy, isRedirect);
+ }
+
+ if (navigationPolicy == WebNavigationPolicyCurrentTab)
+ policyAction = PolicyUse;
+ else if (navigationPolicy == WebNavigationPolicyDownload)
+ policyAction = PolicyDownload;
+ else {
+ if (navigationPolicy != WebNavigationPolicyIgnore) {
+ WrappedResourceRequest webreq(request);
+ m_webFrame->client()->loadURLExternally(m_webFrame, webreq, navigationPolicy);
+ }
+ policyAction = PolicyIgnore;
+ }
}
(m_webFrame->frame()->loader()->policyChecker()->*function)(policyAction);
@@ -958,6 +966,12 @@ void FrameLoaderClientImpl::dispatchUnableToImplementPolicy(const ResourceError&
m_webFrame->client()->unableToImplementPolicyWithError(m_webFrame, error);
}
+void FrameLoaderClientImpl::dispatchWillSendSubmitEvent(HTMLFormElement* form)
+{
+ if (m_webFrame->client())
+ m_webFrame->client()->willSendSubmitEvent(m_webFrame, WebFormElement(form));
+}
+
void FrameLoaderClientImpl::dispatchWillSubmitForm(FramePolicyFunction function,
PassRefPtr<FormState> formState)
{
@@ -997,7 +1011,12 @@ void FrameLoaderClientImpl::postProgressStartedNotification()
void FrameLoaderClientImpl::postProgressEstimateChangedNotification()
{
- // FIXME
+ WebViewImpl* webview = m_webFrame->viewImpl();
+ if (webview && webview->client()) {
+ webview->client()->didChangeLoadProgress(
+ m_webFrame, m_webFrame->frame()->page()->progress()->estimatedProgress());
+ }
+
}
void FrameLoaderClientImpl::postProgressFinishedNotification()
@@ -1048,8 +1067,7 @@ void FrameLoaderClientImpl::committedLoad(DocumentLoader* loader, const char* da
// If we are sending data to MediaDocument, we should stop here
// and cancel the request.
- if (m_webFrame->frame()->document()
- && m_webFrame->frame()->document()->isMediaDocument())
+ if (m_webFrame->frame()->document()->isMediaDocument())
loader->cancelMainResourceLoad(pluginWillHandleLoadError(loader->response()));
// The plugin widget could have been created in the m_webFrame->DidReceiveData
@@ -1060,7 +1078,11 @@ void FrameLoaderClientImpl::committedLoad(DocumentLoader* loader, const char* da
m_pluginWidget->didReceiveResponse(
m_webFrame->frame()->loader()->activeDocumentLoader()->response());
}
- m_pluginWidget->didReceiveData(data, length);
+
+ // It's possible that the above call removed the pointer to the plugin, so
+ // check before calling it.
+ if (m_pluginWidget.get())
+ m_pluginWidget->didReceiveData(data, length);
}
}
@@ -1075,7 +1097,7 @@ void FrameLoaderClientImpl::finishedLoading(DocumentLoader* dl)
// However, we only want to do this if makeRepresentation has been called, to
// match the behavior on the Mac.
if (m_hasRepresentation)
- dl->frameLoader()->setEncoding("", false);
+ dl->frameLoader()->writer()->setEncoding("", false);
}
}
@@ -1087,10 +1109,28 @@ void FrameLoaderClientImpl::updateGlobalHistoryRedirectLinks()
{
}
-bool FrameLoaderClientImpl::shouldGoToHistoryItem(HistoryItem*) const
+bool FrameLoaderClientImpl::shouldGoToHistoryItem(HistoryItem* item) const
{
- // FIXME
- return true;
+ const KURL& url = item->url();
+ if (!url.protocolIs(backForwardNavigationScheme))
+ return true;
+
+ // Else, we'll punt this history navigation to the embedder. It is
+ // necessary that we intercept this here, well before the FrameLoader
+ // has made any state changes for this history traversal.
+
+ bool ok;
+ int offset = url.lastPathComponent().toIntStrict(&ok);
+ if (!ok) {
+ ASSERT_NOT_REACHED();
+ return false;
+ }
+
+ WebViewImpl* webview = m_webFrame->viewImpl();
+ if (webview->client())
+ webview->client()->navigateBackForwardSoon(offset);
+
+ return false;
}
void FrameLoaderClientImpl::dispatchDidAddBackForwardItem(HistoryItem*) const
@@ -1184,6 +1224,12 @@ bool FrameLoaderClientImpl::canHandleRequest(const ResourceRequest& request) con
m_webFrame, WrappedResourceRequest(request));
}
+bool FrameLoaderClientImpl::canShowMIMETypeAsHTML(const String& MIMEType) const
+{
+ notImplemented();
+ return false;
+}
+
bool FrameLoaderClientImpl::canShowMIMEType(const String& mimeType) const
{
// This method is called to determine if the media type can be shown
@@ -1302,6 +1348,10 @@ void FrameLoaderClientImpl::transitionToCommittedForNewPage()
makeDocumentView();
}
+void FrameLoaderClientImpl::dispatchDidBecomeFrameset(bool)
+{
+}
+
bool FrameLoaderClientImpl::canCachePage() const
{
// Since we manage the cache, always report this page as non-cacheable to
@@ -1332,6 +1382,28 @@ PassRefPtr<Frame> FrameLoaderClientImpl::createFrame(
return m_webFrame->createChildFrame(frameRequest, ownerElement);
}
+void FrameLoaderClientImpl::didTransferChildFrameToNewDocument(Page*)
+{
+ ASSERT(m_webFrame->frame()->ownerElement());
+
+ WebFrameImpl* newParent = static_cast<WebFrameImpl*>(m_webFrame->parent());
+ if (!newParent || !newParent->client())
+ return;
+
+ // Replace the client since the old client may be destroyed when the
+ // previous page is closed.
+ m_webFrame->setClient(newParent->client());
+}
+
+void FrameLoaderClientImpl::transferLoadingResourceFromPage(unsigned long identifier, DocumentLoader* loader, const ResourceRequest& request, Page* oldPage)
+{
+ assignIdentifierToInitialRequest(identifier, loader, request);
+
+ WebFrameImpl* oldWebFrame = WebFrameImpl::fromFrame(oldPage->mainFrame());
+ if (oldWebFrame && oldWebFrame->client())
+ oldWebFrame->client()->removeIdentifierForRequest(identifier);
+}
+
PassRefPtr<Widget> FrameLoaderClientImpl::createPlugin(
const IntSize& size, // FIXME: how do we use this?
HTMLPlugInElement* element,
@@ -1341,20 +1413,6 @@ PassRefPtr<Widget> FrameLoaderClientImpl::createPlugin(
const String& mimeType,
bool loadManually)
{
-#if !OS(WINDOWS)
- // WebCore asks us to make a plugin even if we don't have a
- // registered handler, with a comment saying it's so we can display
- // the broken plugin icon. In Chromium, we normally register a
- // fallback plugin handler that allows you to install a missing
- // plugin. Since we don't yet have a default plugin handler, we
- // need to return null here rather than going through all the
- // plugin-creation IPCs only to discover we don't have a plugin
- // registered, which causes a crash.
- // FIXME: remove me once we have a default plugin.
- if (objectContentType(url, mimeType) != ObjectContentNetscapePlugin)
- return 0;
-#endif
-
if (!m_webFrame->client())
return 0;
@@ -1387,7 +1445,8 @@ PassRefPtr<Widget> FrameLoaderClientImpl::createPlugin(
// (e.g., acrobat reader).
void FrameLoaderClientImpl::redirectDataToPlugin(Widget* pluginWidget)
{
- m_pluginWidget = static_cast<WebPluginContainerImpl*>(pluginWidget);
+ if (pluginWidget->isPluginContainer())
+ m_pluginWidget = static_cast<WebPluginContainerImpl*>(pluginWidget);
ASSERT(m_pluginWidget.get());
}
@@ -1452,34 +1511,40 @@ bool FrameLoaderClientImpl::actionSpecifiesNavigationPolicy(
const NavigationAction& action,
WebNavigationPolicy* policy)
{
- if ((action.type() != NavigationTypeLinkClicked) || !action.event()->isMouseEvent())
+ const MouseEvent* event = 0;
+ if (action.type() == NavigationTypeLinkClicked
+ && action.event()->isMouseEvent())
+ event = static_cast<const MouseEvent*>(action.event());
+ else if (action.type() == NavigationTypeFormSubmitted
+ && action.event()
+ && action.event()->underlyingEvent()
+ && action.event()->underlyingEvent()->isMouseEvent())
+ event = static_cast<const MouseEvent*>(action.event()->underlyingEvent());
+
+ if (!event)
return false;
- const MouseEvent* event = static_cast<const MouseEvent*>(action.event());
return WebViewImpl::navigationPolicyFromMouseEvent(
event->button(), event->ctrlKey(), event->shiftKey(), event->altKey(),
event->metaKey(), policy);
}
-void FrameLoaderClientImpl::handleBackForwardNavigation(const KURL& url)
-{
- ASSERT(url.protocolIs(backForwardNavigationScheme));
-
- bool ok;
- int offset = url.lastPathComponent().toIntStrict(&ok);
- if (!ok)
- return;
-
- WebViewImpl* webview = m_webFrame->viewImpl();
- if (webview->client())
- webview->client()->navigateBackForwardSoon(offset);
-}
-
PassOwnPtr<WebPluginLoadObserver> FrameLoaderClientImpl::pluginLoadObserver()
{
WebDataSourceImpl* ds = WebDataSourceImpl::fromDocumentLoader(
m_webFrame->frame()->loader()->activeDocumentLoader());
+ if (!ds) {
+ // We can arrive here if a popstate event handler detaches this frame.
+ // FIXME: Remove this code once http://webkit.org/b/36202 is fixed.
+ ASSERT(!m_webFrame->frame()->page());
+ return 0;
+ }
return ds->releasePluginLoadObserver();
}
+PassRefPtr<FrameNetworkingContext> FrameLoaderClientImpl::createNetworkingContext()
+{
+ return FrameNetworkingContextImpl::create(m_webFrame->frame());
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/FrameLoaderClientImpl.h b/WebKit/chromium/src/FrameLoaderClientImpl.h
index 901600c..ef00ed3 100644
--- a/WebKit/chromium/src/FrameLoaderClientImpl.h
+++ b/WebKit/chromium/src/FrameLoaderClientImpl.h
@@ -31,14 +31,12 @@
#ifndef FrameLoaderClientImpl_h
#define FrameLoaderClientImpl_h
-// FIXME: remove this relative path once consumers from glue are removed.
-#include "../public/WebNavigationPolicy.h"
#include "FrameLoaderClient.h"
#include "KURL.h"
+#include "WebNavigationPolicy.h"
#include <wtf/PassOwnPtr.h>
#include <wtf/RefPtr.h>
-
namespace WebKit {
class WebFrameImpl;
@@ -71,6 +69,10 @@ public:
// in garbage collection.
virtual void didCreateIsolatedScriptContext();
+ // Returns true if we should allow the given V8 extension to be added to
+ // the script context at the currently loading page and given extension group.
+ virtual bool allowScriptExtension(const String& extensionName, int extensionGroup);
+
virtual bool hasWebView() const;
virtual bool hasFrameView() const;
virtual void makeRepresentation(WebCore::DocumentLoader*);
@@ -89,11 +91,11 @@ public:
virtual void dispatchDidFinishLoading(WebCore::DocumentLoader*, unsigned long identifier);
virtual void dispatchDidFailLoading(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceError&);
virtual bool dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, int length);
- virtual void dispatchDidLoadResourceByXMLHttpRequest(unsigned long identifier, const WebCore::ScriptString&);
virtual void dispatchDidHandleOnloadEvents();
virtual void dispatchDidReceiveServerRedirectForProvisionalLoad();
virtual void dispatchDidCancelClientRedirect();
virtual void dispatchWillPerformClientRedirect(const WebCore::KURL&, double interval, double fireDate);
+ virtual void dispatchDidNavigateWithinPage();
virtual void dispatchDidChangeLocationWithinPage();
virtual void dispatchDidPushStateWithinPage();
virtual void dispatchDidReplaceStateWithinPage();
@@ -101,7 +103,8 @@ public:
virtual void dispatchWillClose();
virtual void dispatchDidReceiveIcon();
virtual void dispatchDidStartProvisionalLoad();
- virtual void dispatchDidReceiveTitle(const WebCore::String& title);
+ virtual void dispatchDidReceiveTitle(const WTF::String& title);
+ virtual void dispatchDidChangeIcons();
virtual void dispatchDidCommitLoad();
virtual void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&);
virtual void dispatchDidFailLoad(const WebCore::ResourceError&);
@@ -109,13 +112,14 @@ public:
virtual void dispatchDidFinishLoad();
virtual void dispatchDidFirstLayout();
virtual void dispatchDidFirstVisuallyNonEmptyLayout();
- virtual WebCore::Frame* dispatchCreatePage();
+ virtual WebCore::Frame* dispatchCreatePage(const WebCore::NavigationAction&);
virtual void dispatchShow();
- virtual void dispatchDecidePolicyForMIMEType(WebCore::FramePolicyFunction function, const WebCore::String& mime_type, const WebCore::ResourceRequest&);
- virtual void dispatchDecidePolicyForNewWindowAction(WebCore::FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState> form_state, const WebCore::String& frame_name);
+ virtual void dispatchDecidePolicyForMIMEType(WebCore::FramePolicyFunction function, const WTF::String& mime_type, const WebCore::ResourceRequest&);
+ virtual void dispatchDecidePolicyForNewWindowAction(WebCore::FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState> form_state, const WTF::String& frame_name);
virtual void dispatchDecidePolicyForNavigationAction(WebCore::FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState> form_state);
virtual void cancelPolicyCheck();
virtual void dispatchUnableToImplementPolicy(const WebCore::ResourceError&);
+ virtual void dispatchWillSendSubmitEvent(WebCore::HTMLFormElement*);
virtual void dispatchWillSubmitForm(WebCore::FramePolicyFunction, PassRefPtr<WebCore::FormState>);
virtual void dispatchDidLoadMainResource(WebCore::DocumentLoader*);
virtual void revertToProvisionalState(WebCore::DocumentLoader*);
@@ -148,9 +152,10 @@ public:
virtual WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&);
virtual bool shouldFallBack(const WebCore::ResourceError&);
virtual bool canHandleRequest(const WebCore::ResourceRequest&) const;
- virtual bool canShowMIMEType(const WebCore::String& MIMEType) const;
- virtual bool representationExistsForURLScheme(const WebCore::String& URLScheme) const;
- virtual WebCore::String generatedMIMETypeForURLScheme(const WebCore::String& URLScheme) const;
+ virtual bool canShowMIMEType(const WTF::String& MIMEType) const;
+ virtual bool canShowMIMETypeAsHTML(const String& MIMEType) const;
+ virtual bool representationExistsForURLScheme(const WTF::String& URLScheme) const;
+ virtual WTF::String generatedMIMETypeForURLScheme(const WTF::String& URLScheme) const;
virtual void frameLoadCompleted();
virtual void saveViewStateToItem(WebCore::HistoryItem*);
virtual void restoreViewState();
@@ -159,41 +164,48 @@ public:
virtual void prepareForDataSourceReplacement();
virtual PassRefPtr<WebCore::DocumentLoader> createDocumentLoader(
const WebCore::ResourceRequest&, const WebCore::SubstituteData&);
- virtual void setTitle(const WebCore::String& title, const WebCore::KURL&);
- virtual WebCore::String userAgent(const WebCore::KURL&);
+ virtual void setTitle(const WTF::String& title, const WebCore::KURL&);
+ virtual WTF::String userAgent(const WebCore::KURL&);
virtual void savePlatformDataToCachedFrame(WebCore::CachedFrame*);
virtual void transitionToCommittedFromCachedFrame(WebCore::CachedFrame*);
virtual void transitionToCommittedForNewPage();
+ virtual void dispatchDidBecomeFrameset(bool);
virtual bool canCachePage() const;
virtual void download(
WebCore::ResourceHandle*, const WebCore::ResourceRequest&,
const WebCore::ResourceRequest& initialRequest,
const WebCore::ResourceResponse&);
virtual PassRefPtr<WebCore::Frame> createFrame(
- const WebCore::KURL& url, const WebCore::String& name,
+ const WebCore::KURL& url, const WTF::String& name,
WebCore::HTMLFrameOwnerElement* ownerElement,
- const WebCore::String& referrer, bool allowsScrolling,
+ const WTF::String& referrer, bool allowsScrolling,
int marginWidth, int marginHeight);
+ virtual void didTransferChildFrameToNewDocument(WebCore::Page*);
+ virtual void transferLoadingResourceFromPage(unsigned long, WebCore::DocumentLoader*, const WebCore::ResourceRequest&, WebCore::Page*);
virtual PassRefPtr<WebCore::Widget> createPlugin(
const WebCore::IntSize&, WebCore::HTMLPlugInElement*, const WebCore::KURL&,
- const Vector<WebCore::String>&, const Vector<WebCore::String>&,
- const WebCore::String&, bool loadManually);
+ const Vector<WTF::String>&, const Vector<WTF::String>&,
+ const WTF::String&, bool loadManually);
virtual void redirectDataToPlugin(WebCore::Widget* pluginWidget);
virtual PassRefPtr<WebCore::Widget> createJavaAppletWidget(
const WebCore::IntSize&,
WebCore::HTMLAppletElement*,
const WebCore::KURL& /* base_url */,
- const Vector<WebCore::String>& paramNames,
- const Vector<WebCore::String>& paramValues);
+ const Vector<WTF::String>& paramNames,
+ const Vector<WTF::String>& paramValues);
virtual WebCore::ObjectContentType objectContentType(
- const WebCore::KURL& url, const WebCore::String& mimeType);
- virtual WebCore::String overrideMediaType() const;
+ const WebCore::KURL& url, const WTF::String& mimeType);
+ virtual WTF::String overrideMediaType() const;
virtual void didPerformFirstNavigation() const;
virtual void registerForIconNotification(bool listen = true);
virtual void didChangeScrollOffset();
virtual bool allowJavaScript(bool enabledPerSettings);
virtual bool allowPlugins(bool enabledPerSettings);
virtual bool allowImages(bool enabledPerSettings);
+ virtual void didNotAllowScript();
+ virtual void didNotAllowPlugins();
+
+ virtual PassRefPtr<WebCore::FrameNetworkingContext> createNetworkingContext();
private:
void makeDocumentView();
@@ -203,9 +215,6 @@ private:
static bool actionSpecifiesNavigationPolicy(
const WebCore::NavigationAction& action, WebNavigationPolicy* policy);
- // Called when a dummy back-forward navigation is intercepted.
- void handleBackForwardNavigation(const WebCore::KURL&);
-
PassOwnPtr<WebPluginLoadObserver> pluginLoadObserver();
// The WebFrame that owns this object and manages its lifetime. Therefore,
diff --git a/WebKit/chromium/src/FrameNetworkingContextImpl.h b/WebKit/chromium/src/FrameNetworkingContextImpl.h
new file mode 100644
index 0000000..8670506
--- /dev/null
+++ b/WebKit/chromium/src/FrameNetworkingContextImpl.h
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef FrameNetworkingContextImpl_h
+#define FrameNetworkingContextImpl_h
+
+#include "FrameNetworkingContext.h"
+
+namespace WebKit {
+
+class FrameNetworkingContextImpl : public WebCore::FrameNetworkingContext {
+public:
+ static PassRefPtr<FrameNetworkingContextImpl> create(WebCore::Frame* frame)
+ {
+ return adoptRef(new FrameNetworkingContextImpl(frame));
+ }
+
+private:
+ FrameNetworkingContextImpl(WebCore::Frame* frame)
+ : WebCore::FrameNetworkingContext(frame)
+ {
+ }
+};
+
+}
+
+#endif
diff --git a/WebKit/chromium/src/GraphicsContext3D.cpp b/WebKit/chromium/src/GraphicsContext3D.cpp
deleted file mode 100644
index 83574da..0000000
--- a/WebKit/chromium/src/GraphicsContext3D.cpp
+++ /dev/null
@@ -1,2218 +0,0 @@
-/*
- * Copyright (C) 2009 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#include "config.h"
-
-#if ENABLE(3D_CANVAS)
-
-#include "GraphicsContext3D.h"
-
-#include "CachedImage.h"
-#include "CString.h"
-#include "HTMLCanvasElement.h"
-#include "HTMLImageElement.h"
-#include "ImageBuffer.h"
-#include "ImageData.h"
-#include "NotImplemented.h"
-#include "WebGLBuffer.h"
-#include "WebGLByteArray.h"
-#include "WebGLFloatArray.h"
-#include "WebGLFramebuffer.h"
-#include "WebGLIntArray.h"
-#include "WebGLProgram.h"
-#include "WebGLRenderbuffer.h"
-#include "WebGLRenderingContext.h"
-#include "WebGLShader.h"
-#include "WebGLTexture.h"
-#include "WebGLUnsignedByteArray.h"
-
-#include <stdio.h>
-#include <wtf/FastMalloc.h>
-
-#if OS(WINDOWS)
-#include <windows.h>
-#endif
-
-#include "GL/glew.h"
-
-#if PLATFORM(CG)
-#include "GraphicsContext.h"
-#include <CoreGraphics/CGContext.h>
-#include <CoreGraphics/CGBitmapContext.h>
-#include <CoreGraphics/CGImage.h>
-#include <OpenGL/OpenGL.h>
-#else
-#define FLIP_FRAMEBUFFER_VERTICALLY
-#endif
-
-#if PLATFORM(SKIA)
-#include "NativeImageSkia.h"
-#endif
-
-#if OS(DARWIN)
-#define USE_TEXTURE_RECTANGLE_FOR_FRAMEBUFFER
-#endif
-
-#if OS(LINUX)
-#include <dlfcn.h>
-#include "GL/glxew.h"
-#endif
-
-using namespace std;
-
-namespace WebCore {
-
-// GraphicsContext3DInternal -----------------------------------------------------
-
-// Uncomment this to render to a separate window for debugging
-// #define RENDER_TO_DEBUGGING_WINDOW
-
-#define EXTRACT(val) (!val ? 0 : val->object())
-
-class GraphicsContext3DInternal {
-public:
- GraphicsContext3DInternal(GraphicsContext3D::Attributes attrs);
- ~GraphicsContext3DInternal();
-
- bool makeContextCurrent();
-
- PlatformGraphicsContext3D platformGraphicsContext3D() const;
- Platform3DObject platformTexture() const;
-
- void reshape(int width, int height);
-
- void beginPaint(WebGLRenderingContext* context);
-
- bool validateTextureTarget(int target);
- bool validateTextureParameter(int param);
-
- void activeTexture(unsigned long texture);
- void bindBuffer(unsigned long target,
- WebGLBuffer* buffer);
- void bindFramebuffer(unsigned long target,
- WebGLFramebuffer* framebuffer);
- void bindTexture(unsigned long target,
- WebGLTexture* texture);
- void bufferDataImpl(unsigned long target, int size, const void* data, unsigned long usage);
- void disableVertexAttribArray(unsigned long index);
- void enableVertexAttribArray(unsigned long index);
- unsigned long getError();
- GraphicsContext3D::Attributes getContextAttributes();
- void vertexAttribPointer(unsigned long indx, int size, int type, bool normalized,
- unsigned long stride, unsigned long offset);
- void viewportImpl(long x, long y, unsigned long width, unsigned long height);
-
- void synthesizeGLError(unsigned long error);
-
-private:
- GraphicsContext3D::Attributes m_attrs;
-
- unsigned int m_texture;
- unsigned int m_fbo;
- unsigned int m_depthBuffer;
- unsigned int m_cachedWidth, m_cachedHeight;
-
- // For tracking which FBO is bound
- unsigned int m_boundFBO;
-
-#ifdef FLIP_FRAMEBUFFER_VERTICALLY
- unsigned char* m_scanline;
- void flipVertically(unsigned char* framebuffer,
- unsigned int width,
- unsigned int height);
-#endif
-
- // Note: we aren't currently using this information, but we will
- // need to in order to verify that all enabled vertex arrays have
- // a valid buffer bound -- to avoid crashes on certain cards.
- unsigned int m_boundArrayBuffer;
- class VertexAttribPointerState {
- public:
- VertexAttribPointerState();
-
- bool enabled;
- unsigned long buffer;
- unsigned long indx;
- int size;
- int type;
- bool normalized;
- unsigned long stride;
- unsigned long offset;
- };
-
- enum {
- NumTrackedPointerStates = 2
- };
- VertexAttribPointerState m_vertexAttribPointerState[NumTrackedPointerStates];
-
- // Errors raised by synthesizeGLError().
- ListHashSet<unsigned long> m_syntheticErrors;
-
-#if PLATFORM(SKIA)
- // If the width and height of the Canvas's backing store don't
- // match those that we were given in the most recent call to
- // reshape(), then we need an intermediate bitmap to read back the
- // frame buffer into. This seems to happen when CSS styles are
- // used to resize the Canvas.
- SkBitmap* m_resizingBitmap;
-#endif
-
- static bool s_initializedGLEW;
-#if OS(WINDOWS)
- HWND m_canvasWindow;
- HDC m_canvasDC;
- HGLRC m_contextObj;
-#elif PLATFORM(CG)
- CGLPBufferObj m_pbuffer;
- CGLContextObj m_contextObj;
- unsigned char* m_renderOutput;
-#elif OS(LINUX)
- GLXContext m_contextObj;
- GLXPbuffer m_pbuffer;
-
- // In order to avoid problems caused by linking against libGL, we
- // dynamically look up all the symbols we need.
- // http://code.google.com/p/chromium/issues/detail?id=16800
- class GLConnection {
- public:
- ~GLConnection();
-
- static GLConnection* create();
-
- GLXFBConfig* chooseFBConfig(int screen, const int *attrib_list, int *nelements)
- {
- return m_glXChooseFBConfig(m_display, screen, attrib_list, nelements);
- }
-
- GLXContext createNewContext(GLXFBConfig config, int renderType, GLXContext shareList, Bool direct)
- {
- return m_glXCreateNewContext(m_display, config, renderType, shareList, direct);
- }
-
- GLXPbuffer createPbuffer(GLXFBConfig config, const int *attribList)
- {
- return m_glXCreatePbuffer(m_display, config, attribList);
- }
-
- void destroyPbuffer(GLXPbuffer pbuf)
- {
- m_glXDestroyPbuffer(m_display, pbuf);
- }
-
- Bool makeCurrent(GLXDrawable drawable, GLXContext ctx)
- {
- return m_glXMakeCurrent(m_display, drawable, ctx);
- }
-
- void destroyContext(GLXContext ctx)
- {
- m_glXDestroyContext(m_display, ctx);
- }
-
- GLXContext getCurrentContext()
- {
- return m_glXGetCurrentContext();
- }
-
- private:
- Display* m_display;
- void* m_libGL;
- PFNGLXCHOOSEFBCONFIGPROC m_glXChooseFBConfig;
- PFNGLXCREATENEWCONTEXTPROC m_glXCreateNewContext;
- PFNGLXCREATEPBUFFERPROC m_glXCreatePbuffer;
- PFNGLXDESTROYPBUFFERPROC m_glXDestroyPbuffer;
- typedef Bool (* PFNGLXMAKECURRENTPROC)(Display* dpy, GLXDrawable drawable, GLXContext ctx);
- PFNGLXMAKECURRENTPROC m_glXMakeCurrent;
- typedef void (* PFNGLXDESTROYCONTEXTPROC)(Display* dpy, GLXContext ctx);
- PFNGLXDESTROYCONTEXTPROC m_glXDestroyContext;
- typedef GLXContext (* PFNGLXGETCURRENTCONTEXTPROC)(void);
- PFNGLXGETCURRENTCONTEXTPROC m_glXGetCurrentContext;
-
- GLConnection(Display* display,
- void* libGL,
- PFNGLXCHOOSEFBCONFIGPROC chooseFBConfig,
- PFNGLXCREATENEWCONTEXTPROC createNewContext,
- PFNGLXCREATEPBUFFERPROC createPbuffer,
- PFNGLXDESTROYPBUFFERPROC destroyPbuffer,
- PFNGLXMAKECURRENTPROC makeCurrent,
- PFNGLXDESTROYCONTEXTPROC destroyContext,
- PFNGLXGETCURRENTCONTEXTPROC getCurrentContext)
- : m_libGL(libGL)
- , m_display(display)
- , m_glXChooseFBConfig(chooseFBConfig)
- , m_glXCreateNewContext(createNewContext)
- , m_glXCreatePbuffer(createPbuffer)
- , m_glXDestroyPbuffer(destroyPbuffer)
- , m_glXMakeCurrent(makeCurrent)
- , m_glXDestroyContext(destroyContext)
- , m_glXGetCurrentContext(getCurrentContext)
- {
- }
- };
-
- static GLConnection* s_gl;
-#else
- #error Must port GraphicsContext3D to your platform
-#endif
-};
-
-bool GraphicsContext3DInternal::s_initializedGLEW = false;
-
-#if OS(LINUX)
-GraphicsContext3DInternal::GLConnection* GraphicsContext3DInternal::s_gl = 0;
-
-GraphicsContext3DInternal::GLConnection* GraphicsContext3DInternal::GLConnection::create()
-{
- Display* dpy = XOpenDisplay(0);
- if (!dpy) {
- printf("GraphicsContext3D: error opening X display\n");
- return 0;
- }
-
- // We use RTLD_GLOBAL semantics so that GLEW initialization works;
- // GLEW expects to be able to open the current process's handle
- // and do dlsym's of GL entry points from there.
- void* libGL = dlopen("libGL.so.1", RTLD_LAZY | RTLD_GLOBAL);
- if (!libGL) {
- XCloseDisplay(dpy);
- printf("GraphicsContext3D: error opening libGL.so.1: %s\n", dlerror());
- return 0;
- }
-
- PFNGLXCHOOSEFBCONFIGPROC chooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC) dlsym(libGL, "glXChooseFBConfig");
- PFNGLXCREATENEWCONTEXTPROC createNewContext = (PFNGLXCREATENEWCONTEXTPROC) dlsym(libGL, "glXCreateNewContext");
- PFNGLXCREATEPBUFFERPROC createPbuffer = (PFNGLXCREATEPBUFFERPROC) dlsym(libGL, "glXCreatePbuffer");
- PFNGLXDESTROYPBUFFERPROC destroyPbuffer = (PFNGLXDESTROYPBUFFERPROC) dlsym(libGL, "glXDestroyPbuffer");
- PFNGLXMAKECURRENTPROC makeCurrent = (PFNGLXMAKECURRENTPROC) dlsym(libGL, "glXMakeCurrent");
- PFNGLXDESTROYCONTEXTPROC destroyContext = (PFNGLXDESTROYCONTEXTPROC) dlsym(libGL, "glXDestroyContext");
- PFNGLXGETCURRENTCONTEXTPROC getCurrentContext = (PFNGLXGETCURRENTCONTEXTPROC) dlsym(libGL, "glXGetCurrentContext");
- if (!chooseFBConfig || !createNewContext || !createPbuffer
- || !destroyPbuffer || !makeCurrent || !destroyContext
- || !getCurrentContext) {
- XCloseDisplay(dpy);
- dlclose(libGL);
- printf("GraphicsContext3D: error looking up bootstrapping entry points\n");
- return 0;
- }
- return new GLConnection(dpy,
- libGL,
- chooseFBConfig,
- createNewContext,
- createPbuffer,
- destroyPbuffer,
- makeCurrent,
- destroyContext,
- getCurrentContext);
-}
-
-GraphicsContext3DInternal::GLConnection::~GLConnection()
-{
- XCloseDisplay(m_display);
- dlclose(m_libGL);
-}
-
-#endif // OS(LINUX)
-
-GraphicsContext3DInternal::VertexAttribPointerState::VertexAttribPointerState()
- : enabled(false)
- , buffer(0)
- , indx(0)
- , size(0)
- , type(0)
- , normalized(false)
- , stride(0)
- , offset(0)
-{
-}
-
-GraphicsContext3DInternal::GraphicsContext3DInternal(GraphicsContext3D::Attributes attrs)
- : m_attrs(attrs)
- , m_texture(0)
- , m_fbo(0)
- , m_depthBuffer(0)
- , m_boundFBO(0)
-#ifdef FLIP_FRAMEBUFFER_VERTICALLY
- , m_scanline(0)
-#endif
- , m_boundArrayBuffer(0)
-#if PLATFORM(SKIA)
- , m_resizingBitmap(0)
-#endif
-#if OS(WINDOWS)
- , m_canvasWindow(0)
- , m_canvasDC(0)
- , m_contextObj(0)
-#elif PLATFORM(CG)
- , m_pbuffer(0)
- , m_contextObj(0)
- , m_renderOutput(0)
-#elif OS(LINUX)
- , m_contextObj(0)
- , m_pbuffer(0)
-#else
-#error Must port to your platform
-#endif
-{
- // FIXME: we need to take into account the user's requested
- // context creation attributes, in particular stencil and
- // antialias, and determine which could and could not be honored
- // based on the capabilities of the OpenGL implementation.
- m_attrs.alpha = true;
- m_attrs.depth = true;
- m_attrs.stencil = false;
- m_attrs.antialias = false;
- m_attrs.premultipliedAlpha = true;
-
-#if OS(WINDOWS)
- WNDCLASS wc;
- if (!GetClassInfo(GetModuleHandle(0), L"CANVASGL", &wc)) {
- ZeroMemory(&wc, sizeof(WNDCLASS));
- wc.style = CS_OWNDC;
- wc.hInstance = GetModuleHandle(0);
- wc.lpfnWndProc = DefWindowProc;
- wc.lpszClassName = L"CANVASGL";
-
- if (!RegisterClass(&wc)) {
- printf("GraphicsContext3D: RegisterClass failed\n");
- return;
- }
- }
-
- m_canvasWindow = CreateWindow(L"CANVASGL", L"CANVASGL",
- WS_CAPTION,
- CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
- CW_USEDEFAULT, 0, 0, GetModuleHandle(0), 0);
- if (!m_canvasWindow) {
- printf("GraphicsContext3DInternal: CreateWindow failed\n");
- return;
- }
-
- // get the device context
- m_canvasDC = GetDC(m_canvasWindow);
- if (!m_canvasDC) {
- printf("GraphicsContext3DInternal: GetDC failed\n");
- return;
- }
-
- // find default pixel format
- PIXELFORMATDESCRIPTOR pfd;
- ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));
- pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
- pfd.nVersion = 1;
- pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL
-#ifdef RENDER_TO_DEBUGGING_WINDOW
- | PFD_DOUBLEBUFFER
-#endif // RENDER_TO_DEBUGGING_WINDOW
- ;
- int pixelformat = ChoosePixelFormat(m_canvasDC, &pfd);
-
- // set the pixel format for the dc
- if (!SetPixelFormat(m_canvasDC, pixelformat, &pfd)) {
- printf("GraphicsContext3D: SetPixelFormat failed\n");
- return;
- }
-
- // create rendering context
- m_contextObj = wglCreateContext(m_canvasDC);
- if (!m_contextObj) {
- printf("GraphicsContext3D: wglCreateContext failed\n");
- return;
- }
-
- if (!wglMakeCurrent(m_canvasDC, m_contextObj)) {
- printf("GraphicsContext3D: wglMakeCurrent failed\n");
- return;
- }
-
-#ifdef RENDER_TO_DEBUGGING_WINDOW
- typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
- PFNWGLSWAPINTERVALEXTPROC setSwapInterval = 0;
- setSwapInterval = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");
- if (setSwapInterval)
- setSwapInterval(1);
-#endif // RENDER_TO_DEBUGGING_WINDOW
-
-#elif PLATFORM(CG)
- // Create a 1x1 pbuffer and associated context to bootstrap things
- CGLPixelFormatAttribute attribs[] = {
- (CGLPixelFormatAttribute) kCGLPFAPBuffer,
- (CGLPixelFormatAttribute) 0
- };
- CGLPixelFormatObj pixelFormat;
- GLint numPixelFormats;
- if (CGLChoosePixelFormat(attribs, &pixelFormat, &numPixelFormats) != kCGLNoError) {
- printf("GraphicsContext3D: error choosing pixel format\n");
- return;
- }
- if (!pixelFormat) {
- printf("GraphicsContext3D: no pixel format selected\n");
- return;
- }
- CGLContextObj context;
- CGLError res = CGLCreateContext(pixelFormat, 0, &context);
- CGLDestroyPixelFormat(pixelFormat);
- if (res != kCGLNoError) {
- printf("GraphicsContext3D: error creating context\n");
- return;
- }
- CGLPBufferObj pbuffer;
- if (CGLCreatePBuffer(1, 1, GL_TEXTURE_2D, GL_RGBA, 0, &pbuffer) != kCGLNoError) {
- CGLDestroyContext(context);
- printf("GraphicsContext3D: error creating pbuffer\n");
- return;
- }
- if (CGLSetPBuffer(context, pbuffer, 0, 0, 0) != kCGLNoError) {
- CGLDestroyContext(context);
- CGLDestroyPBuffer(pbuffer);
- printf("GraphicsContext3D: error attaching pbuffer to context\n");
- return;
- }
- if (CGLSetCurrentContext(context) != kCGLNoError) {
- CGLDestroyContext(context);
- CGLDestroyPBuffer(pbuffer);
- printf("GraphicsContext3D: error making context current\n");
- return;
- }
- m_pbuffer = pbuffer;
- m_contextObj = context;
-#elif OS(LINUX)
- if (!s_gl) {
- s_gl = GLConnection::create();
- if (!s_gl)
- return;
- }
-
- int configAttrs[] = {
- GLX_DRAWABLE_TYPE,
- GLX_PBUFFER_BIT,
- GLX_RENDER_TYPE,
- GLX_RGBA_BIT,
- GLX_DOUBLEBUFFER,
- 0,
- 0
- };
- int nelements = 0;
- GLXFBConfig* config = s_gl->chooseFBConfig(0, configAttrs, &nelements);
- if (!config) {
- printf("GraphicsContext3D: glXChooseFBConfig failed\n");
- return;
- }
- if (!nelements) {
- printf("GraphicsContext3D: glXChooseFBConfig returned 0 elements\n");
- XFree(config);
- return;
- }
- GLXContext context = s_gl->createNewContext(config[0], GLX_RGBA_TYPE, 0, True);
- if (!context) {
- printf("GraphicsContext3D: glXCreateNewContext failed\n");
- XFree(config);
- return;
- }
- int pbufferAttrs[] = {
- GLX_PBUFFER_WIDTH,
- 1,
- GLX_PBUFFER_HEIGHT,
- 1,
- 0
- };
- GLXPbuffer pbuffer = s_gl->createPbuffer(config[0], pbufferAttrs);
- XFree(config);
- if (!pbuffer) {
- printf("GraphicsContext3D: glxCreatePbuffer failed\n");
- return;
- }
- if (!s_gl->makeCurrent(pbuffer, context)) {
- printf("GraphicsContext3D: glXMakeCurrent failed\n");
- return;
- }
- m_contextObj = context;
- m_pbuffer = pbuffer;
-#else
-#error Must port to your platform
-#endif
-
- if (!s_initializedGLEW) {
- // Initialize GLEW and check for GL 2.0 support by the drivers.
- GLenum glewInitResult = glewInit();
- if (glewInitResult != GLEW_OK) {
- printf("GraphicsContext3D: GLEW initialization failed\n");
- return;
- }
- if (!glewIsSupported("GL_VERSION_2_0")) {
- printf("GraphicsContext3D: OpenGL 2.0 not supported\n");
- return;
- }
- s_initializedGLEW = true;
- }
-}
-
-GraphicsContext3DInternal::~GraphicsContext3DInternal()
-{
- makeContextCurrent();
-#ifndef RENDER_TO_DEBUGGING_WINDOW
- glDeleteRenderbuffersEXT(1, &m_depthBuffer);
- glDeleteTextures(1, &m_texture);
-#ifdef FLIP_FRAMEBUFFER_VERTICALLY
- if (m_scanline)
- delete[] m_scanline;
-#endif
- glDeleteFramebuffersEXT(1, &m_fbo);
-#endif // !RENDER_TO_DEBUGGING_WINDOW
-#if PLATFORM(SKIA)
- if (m_resizingBitmap)
- delete m_resizingBitmap;
-#endif
-#if OS(WINDOWS)
- wglMakeCurrent(0, 0);
- wglDeleteContext(m_contextObj);
- ReleaseDC(m_canvasWindow, m_canvasDC);
- DestroyWindow(m_canvasWindow);
-#elif PLATFORM(CG)
- CGLSetCurrentContext(0);
- CGLDestroyContext(m_contextObj);
- CGLDestroyPBuffer(m_pbuffer);
- if (m_renderOutput)
- delete[] m_renderOutput;
-#elif OS(LINUX)
- s_gl->makeCurrent(0, 0);
- s_gl->destroyContext(m_contextObj);
- s_gl->destroyPbuffer(m_pbuffer);
-#else
-#error Must port to your platform
-#endif
- m_contextObj = 0;
-}
-
-bool GraphicsContext3DInternal::makeContextCurrent()
-{
-#if OS(WINDOWS)
- if (wglGetCurrentContext() != m_contextObj)
- if (wglMakeCurrent(m_canvasDC, m_contextObj))
- return true;
-#elif PLATFORM(CG)
- if (CGLGetCurrentContext() != m_contextObj)
- if (CGLSetCurrentContext(m_contextObj) == kCGLNoError)
- return true;
-#elif OS(LINUX)
- if (s_gl->getCurrentContext() != m_contextObj)
- if (s_gl->makeCurrent(m_pbuffer, m_contextObj))
- return true;
-#else
-#error Must port to your platform
-#endif
- return false;
-}
-
-PlatformGraphicsContext3D GraphicsContext3DInternal::platformGraphicsContext3D() const
-{
- return m_contextObj;
-}
-
-Platform3DObject GraphicsContext3DInternal::platformTexture() const
-{
- return m_texture;
-}
-
-static int createTextureObject(GLenum target)
-{
- GLuint texture = 0;
- glGenTextures(1, &texture);
- glBindTexture(target, texture);
- glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- return texture;
-}
-
-void GraphicsContext3DInternal::reshape(int width, int height)
-{
-#ifdef RENDER_TO_DEBUGGING_WINDOW
- SetWindowPos(m_canvasWindow, HWND_TOP, 0, 0, width, height,
- SWP_NOMOVE);
- ShowWindow(m_canvasWindow, SW_SHOW);
-#endif
-
- m_cachedWidth = width;
- m_cachedHeight = height;
- makeContextCurrent();
-
-#ifndef RENDER_TO_DEBUGGING_WINDOW
-#ifdef USE_TEXTURE_RECTANGLE_FOR_FRAMEBUFFER
- // GL_TEXTURE_RECTANGLE_ARB is the best supported render target on Mac OS X
- GLenum target = GL_TEXTURE_RECTANGLE_ARB;
-#else
- GLenum target = GL_TEXTURE_2D;
-#endif
- if (!m_texture) {
- // Generate the texture object
- m_texture = createTextureObject(target);
- // Generate the framebuffer object
- glGenFramebuffersEXT(1, &m_fbo);
- // Generate the depth buffer
- glGenRenderbuffersEXT(1, &m_depthBuffer);
- }
-
- // Reallocate the color and depth buffers
- glBindTexture(target, m_texture);
- glTexImage2D(target, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- glBindTexture(target, 0);
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
- m_boundFBO = m_fbo;
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthBuffer);
- glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
-
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target, m_texture, 0);
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthBuffer);
- GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
- if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
- printf("GraphicsContext3D: framebuffer was incomplete\n");
-
- // FIXME: cleanup.
- notImplemented();
- }
-#endif // RENDER_TO_DEBUGGING_WINDOW
-
-#ifdef FLIP_FRAMEBUFFER_VERTICALLY
- if (m_scanline) {
- delete[] m_scanline;
- m_scanline = 0;
- }
- m_scanline = new unsigned char[width * 4];
-#endif // FLIP_FRAMEBUFFER_VERTICALLY
-
- glClear(GL_COLOR_BUFFER_BIT);
-
-#if PLATFORM(CG)
- // Need to reallocate the client-side backing store.
- // FIXME: make this more efficient.
- if (m_renderOutput) {
- delete[] m_renderOutput;
- m_renderOutput = 0;
- }
- int rowBytes = width * 4;
- m_renderOutput = new unsigned char[height * rowBytes];
-#endif // PLATFORM(CG)
-}
-
-#ifdef FLIP_FRAMEBUFFER_VERTICALLY
-void GraphicsContext3DInternal::flipVertically(unsigned char* framebuffer,
- unsigned int width,
- unsigned int height)
-{
- unsigned char* scanline = m_scanline;
- if (!scanline)
- return;
- unsigned int rowBytes = width * 4;
- unsigned int count = height / 2;
- for (unsigned int i = 0; i < count; i++) {
- unsigned char* rowA = framebuffer + i * rowBytes;
- unsigned char* rowB = framebuffer + (height - i - 1) * rowBytes;
- // FIXME: this is where the multiplication of the alpha
- // channel into the color buffer will need to occur if the
- // user specifies the "premultiplyAlpha" flag in the context
- // creation attributes.
- memcpy(scanline, rowB, rowBytes);
- memcpy(rowB, rowA, rowBytes);
- memcpy(rowA, scanline, rowBytes);
- }
-}
-#endif
-
-void GraphicsContext3DInternal::beginPaint(WebGLRenderingContext* context)
-{
- makeContextCurrent();
-
-#ifdef RENDER_TO_DEBUGGING_WINDOW
- SwapBuffers(m_canvasDC);
-#else
- // Earlier versions of this code used the GPU to flip the
- // framebuffer vertically before reading it back for compositing
- // via software. This code was quite complicated, used a lot of
- // GPU memory, and didn't provide an obvious speedup. Since this
- // vertical flip is only a temporary solution anyway until Chrome
- // is fully GPU composited, it wasn't worth the complexity.
-
- HTMLCanvasElement* canvas = context->canvas();
- ImageBuffer* imageBuffer = canvas->buffer();
- unsigned char* pixels = 0;
- bool mustRestoreFBO = (m_boundFBO != m_fbo);
- if (mustRestoreFBO)
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
-#if PLATFORM(SKIA)
- const SkBitmap* canvasBitmap = imageBuffer->context()->platformContext()->bitmap();
- const SkBitmap* readbackBitmap = 0;
- ASSERT(canvasBitmap->config() == SkBitmap::kARGB_8888_Config);
- if (canvasBitmap->width() == m_cachedWidth && canvasBitmap->height() == m_cachedHeight) {
- // This is the fastest and most common case. We read back
- // directly into the canvas's backing store.
- readbackBitmap = canvasBitmap;
- if (m_resizingBitmap) {
- delete m_resizingBitmap;
- m_resizingBitmap = 0;
- }
- } else {
- // We need to allocate a temporary bitmap for reading back the
- // pixel data. We will then use Skia to rescale this bitmap to
- // the size of the canvas's backing store.
- if (m_resizingBitmap && (m_resizingBitmap->width() != m_cachedWidth || m_resizingBitmap->height() != m_cachedHeight)) {
- delete m_resizingBitmap;
- m_resizingBitmap = 0;
- }
- if (!m_resizingBitmap) {
- m_resizingBitmap = new SkBitmap();
- m_resizingBitmap->setConfig(SkBitmap::kARGB_8888_Config,
- m_cachedWidth,
- m_cachedHeight);
- if (!m_resizingBitmap->allocPixels()) {
- delete m_resizingBitmap;
- m_resizingBitmap = 0;
- return;
- }
- }
- readbackBitmap = m_resizingBitmap;
- }
-
- // Read back the frame buffer.
- SkAutoLockPixels bitmapLock(*readbackBitmap);
- pixels = static_cast<unsigned char*>(readbackBitmap->getPixels());
- glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
-#elif PLATFORM(CG)
- if (m_renderOutput) {
- pixels = m_renderOutput;
- glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
- }
-#else
-#error Must port to your platform
-#endif
-
- if (mustRestoreFBO)
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
-
-#ifdef FLIP_FRAMEBUFFER_VERTICALLY
- if (pixels)
- flipVertically(pixels, m_cachedWidth, m_cachedHeight);
-#endif
-
-#if PLATFORM(SKIA)
- if (m_resizingBitmap) {
- // We need to draw the resizing bitmap into the canvas's backing store.
- SkCanvas canvas(*canvasBitmap);
- SkRect dst;
- dst.set(0, 0, canvasBitmap->width(), canvasBitmap->height());
- canvas.drawBitmapRect(*m_resizingBitmap, 0, dst);
- }
-#elif PLATFORM(CG)
- if (m_renderOutput) {
- int rowBytes = m_cachedWidth * 4;
- CGDataProviderRef dataProvider = CGDataProviderCreateWithData(0, m_renderOutput, rowBytes * m_cachedHeight, 0);
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- CGImageRef cgImage = CGImageCreate(m_cachedWidth,
- m_cachedHeight,
- 8,
- 32,
- rowBytes,
- colorSpace,
- kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host,
- dataProvider,
- 0,
- false,
- kCGRenderingIntentDefault);
- // CSS styling may cause the canvas's content to be resized on
- // the page. Go back to the Canvas to figure out the correct
- // width and height to draw.
- CGRect rect = CGRectMake(0, 0,
- context->canvas()->width(),
- context->canvas()->height());
- // We want to completely overwrite the previous frame's
- // rendering results.
- CGContextSetBlendMode(imageBuffer->context()->platformContext(),
- kCGBlendModeCopy);
- CGContextSetInterpolationQuality(imageBuffer->context()->platformContext(),
- kCGInterpolationNone);
- CGContextDrawImage(imageBuffer->context()->platformContext(),
- rect, cgImage);
- CGImageRelease(cgImage);
- CGColorSpaceRelease(colorSpace);
- CGDataProviderRelease(dataProvider);
- }
-#else
-#error Must port to your platform
-#endif
-
-#endif // RENDER_TO_DEBUGGING_WINDOW
-}
-
-void GraphicsContext3DInternal::activeTexture(unsigned long texture)
-{
- // FIXME: query number of textures available.
- if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0+32)
- // FIXME: raise exception.
- return;
-
- makeContextCurrent();
- glActiveTexture(texture);
-}
-
-void GraphicsContext3DInternal::bindBuffer(unsigned long target,
- WebGLBuffer* buffer)
-{
- makeContextCurrent();
- GLuint bufID = EXTRACT(buffer);
- if (target == GL_ARRAY_BUFFER)
- m_boundArrayBuffer = bufID;
- glBindBuffer(target, bufID);
-}
-
-void GraphicsContext3DInternal::bindFramebuffer(unsigned long target,
- WebGLFramebuffer* framebuffer)
-{
- makeContextCurrent();
- GLuint id = EXTRACT(framebuffer);
- if (!id)
- id = m_fbo;
- glBindFramebufferEXT(target, id);
- m_boundFBO = id;
-}
-
-// If we didn't have to hack GL_TEXTURE_WRAP_R for cube maps,
-// we could just use:
-// GL_SAME_METHOD_2_X2(BindTexture, bindTexture, unsigned long, WebGLTexture*)
-void GraphicsContext3DInternal::bindTexture(unsigned long target,
- WebGLTexture* texture)
-{
- makeContextCurrent();
- unsigned int textureObject = EXTRACT(texture);
-
- glBindTexture(target, textureObject);
-
- // FIXME: GL_TEXTURE_WRAP_R isn't exposed in the OpenGL ES 2.0
- // API. On desktop OpenGL implementations it seems necessary to
- // set this wrap mode to GL_CLAMP_TO_EDGE to get correct behavior
- // of cube maps.
- if (texture) {
- if (target == GL_TEXTURE_CUBE_MAP) {
- if (!texture->isCubeMapRWrapModeInitialized()) {
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- texture->setCubeMapRWrapModeInitialized(true);
- }
- } else
- texture->setCubeMapRWrapModeInitialized(false);
- }
-}
-
-void GraphicsContext3DInternal::bufferDataImpl(unsigned long target, int size, const void* data, unsigned long usage)
-{
- makeContextCurrent();
- // FIXME: make this verification more efficient.
- GLint binding = 0;
- GLenum binding_target = GL_ARRAY_BUFFER_BINDING;
- if (target == GL_ELEMENT_ARRAY_BUFFER)
- binding_target = GL_ELEMENT_ARRAY_BUFFER_BINDING;
- glGetIntegerv(binding_target, &binding);
- if (binding <= 0) {
- // FIXME: raise exception.
- // LogMessagef(("bufferData: no buffer bound"));
- return;
- }
-
- glBufferData(target,
- size,
- data,
- usage);
-}
-
-void GraphicsContext3DInternal::disableVertexAttribArray(unsigned long index)
-{
- makeContextCurrent();
- if (index < NumTrackedPointerStates)
- m_vertexAttribPointerState[index].enabled = false;
- glDisableVertexAttribArray(index);
-}
-
-void GraphicsContext3DInternal::enableVertexAttribArray(unsigned long index)
-{
- makeContextCurrent();
- if (index < NumTrackedPointerStates)
- m_vertexAttribPointerState[index].enabled = true;
- glEnableVertexAttribArray(index);
-}
-
-unsigned long GraphicsContext3DInternal::getError()
-{
- if (m_syntheticErrors.size() > 0) {
- ListHashSet<unsigned long>::iterator iter = m_syntheticErrors.begin();
- unsigned long err = *iter;
- m_syntheticErrors.remove(iter);
- return err;
- }
-
- makeContextCurrent();
- return glGetError();
-}
-
-GraphicsContext3D::Attributes GraphicsContext3DInternal::getContextAttributes()
-{
- return m_attrs;
-}
-
-void GraphicsContext3DInternal::vertexAttribPointer(unsigned long indx, int size, int type, bool normalized,
- unsigned long stride, unsigned long offset)
-{
- makeContextCurrent();
-
- if (m_boundArrayBuffer <= 0) {
- // FIXME: raise exception.
- // LogMessagef(("bufferData: no buffer bound"));
- return;
- }
-
- if (indx < NumTrackedPointerStates) {
- VertexAttribPointerState& state = m_vertexAttribPointerState[indx];
- state.buffer = m_boundArrayBuffer;
- state.indx = indx;
- state.size = size;
- state.type = type;
- state.normalized = normalized;
- state.stride = stride;
- state.offset = offset;
- }
-
- glVertexAttribPointer(indx, size, type, normalized, stride,
- reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
-}
-
-void GraphicsContext3DInternal::viewportImpl(long x, long y, unsigned long width, unsigned long height)
-{
- glViewport(x, y, width, height);
-}
-
-void GraphicsContext3DInternal::synthesizeGLError(unsigned long error)
-{
- m_syntheticErrors.add(error);
-}
-
-// GraphicsContext3D -----------------------------------------------------
-
-/* Helper macros for when we're just wrapping a gl method, so that
- * we can avoid having to type this 500 times. Note that these MUST
- * NOT BE USED if we need to check any of the parameters.
- */
-
-#define GL_SAME_METHOD_0(glname, name) \
-void GraphicsContext3D::name() \
-{ \
- makeContextCurrent(); \
- gl##glname(); \
-}
-
-#define GL_SAME_METHOD_1(glname, name, t1) \
-void GraphicsContext3D::name(t1 a1) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1); \
-}
-
-#define GL_SAME_METHOD_1_X(glname, name, t1) \
-void GraphicsContext3D::name(t1 a1) \
-{ \
- makeContextCurrent(); \
- gl##glname(EXTRACT(a1)); \
-}
-
-#define GL_SAME_METHOD_2(glname, name, t1, t2) \
-void GraphicsContext3D::name(t1 a1, t2 a2) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, a2); \
-}
-
-#define GL_SAME_METHOD_2_X12(glname, name, t1, t2) \
-void GraphicsContext3D::name(t1 a1, t2 a2) \
-{ \
- makeContextCurrent(); \
- gl##glname(EXTRACT(a1), EXTRACT(a2)); \
-}
-
-#define GL_SAME_METHOD_2_X2(glname, name, t1, t2) \
-void GraphicsContext3D::name(t1 a1, t2 a2) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, EXTRACT(a2)); \
-}
-
-#define GL_SAME_METHOD_3(glname, name, t1, t2, t3) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, a2, a3); \
-}
-
-#define GL_SAME_METHOD_3_X12(glname, name, t1, t2, t3) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \
-{ \
- makeContextCurrent(); \
- gl##glname(EXTRACT(a1), EXTRACT(a2), a3); \
-}
-
-#define GL_SAME_METHOD_3_X2(glname, name, t1, t2, t3) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, EXTRACT(a2), a3); \
-}
-
-#define GL_SAME_METHOD_4(glname, name, t1, t2, t3, t4) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, a2, a3, a4); \
-}
-
-#define GL_SAME_METHOD_4_X4(glname, name, t1, t2, t3, t4) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, a2, a3, EXTRACT(a4)); \
-}
-
-#define GL_SAME_METHOD_5(glname, name, t1, t2, t3, t4, t5) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, a2, a3, a4, a5); \
-}
-
-#define GL_SAME_METHOD_5_X4(glname, name, t1, t2, t3, t4, t5) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, a2, a3, EXTRACT(a4), a5); \
-}
-
-#define GL_SAME_METHOD_6(glname, name, t1, t2, t3, t4, t5, t6) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, a2, a3, a4, a5, a6); \
-}
-
-#define GL_SAME_METHOD_8(glname, name, t1, t2, t3, t4, t5, t6, t7, t8) \
-void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) \
-{ \
- makeContextCurrent(); \
- gl##glname(a1, a2, a3, a4, a5, a6, a7, a8); \
-}
-
-PassOwnPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attrs)
-{
- PassOwnPtr<GraphicsContext3D> context = new GraphicsContext3D(attrs);
- // FIXME: add error checking
- return context;
-}
-
-GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs)
- : m_currentWidth(0)
- , m_currentHeight(0)
- , m_internal(new GraphicsContext3DInternal(attrs))
-{
-}
-
-GraphicsContext3D::~GraphicsContext3D()
-{
-}
-
-PlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D() const
-{
- return m_internal->platformGraphicsContext3D();
-}
-
-Platform3DObject GraphicsContext3D::platformTexture() const
-{
- return m_internal->platformTexture();
-}
-
-void GraphicsContext3D::makeContextCurrent()
-{
- m_internal->makeContextCurrent();
-}
-
-void GraphicsContext3D::reshape(int width, int height)
-{
- if (width == m_currentWidth && height == m_currentHeight)
- return;
-
- m_currentWidth = width;
- m_currentHeight = height;
-
- m_internal->reshape(width, height);
-}
-
-void GraphicsContext3D::beginPaint(WebGLRenderingContext* context)
-{
- m_internal->beginPaint(context);
-}
-
-void GraphicsContext3D::endPaint()
-{
-}
-
-int GraphicsContext3D::sizeInBytes(int type)
-{
- switch (type) {
- case GL_BYTE:
- return sizeof(GLbyte);
- case GL_UNSIGNED_BYTE:
- return sizeof(GLubyte);
- case GL_SHORT:
- return sizeof(GLshort);
- case GL_UNSIGNED_SHORT:
- return sizeof(GLushort);
- case GL_INT:
- return sizeof(GLint);
- case GL_UNSIGNED_INT:
- return sizeof(GLuint);
- case GL_FLOAT:
- return sizeof(GLfloat);
- default: // FIXME: default cases are discouraged in WebKit.
- return 0;
- }
-}
-
-unsigned GraphicsContext3D::createBuffer()
-{
- makeContextCurrent();
- GLuint o;
- glGenBuffers(1, &o);
- return o;
-}
-
-unsigned GraphicsContext3D::createFramebuffer()
-{
- makeContextCurrent();
- GLuint o = 0;
- glGenFramebuffersEXT(1, &o);
- return o;
-}
-
-unsigned GraphicsContext3D::createProgram()
-{
- makeContextCurrent();
- return glCreateProgram();
-}
-
-unsigned GraphicsContext3D::createRenderbuffer()
-{
- makeContextCurrent();
- GLuint o;
- glGenRenderbuffersEXT(1, &o);
- return o;
-}
-
-unsigned GraphicsContext3D::createShader(unsigned long type)
-{
- makeContextCurrent();
- return glCreateShader((type == FRAGMENT_SHADER) ? GL_FRAGMENT_SHADER : GL_VERTEX_SHADER);
-}
-
-unsigned GraphicsContext3D::createTexture()
-{
- makeContextCurrent();
- GLuint o;
- glGenTextures(1, &o);
- return o;
-}
-
-void GraphicsContext3D::deleteBuffer(unsigned buffer)
-{
- makeContextCurrent();
- glDeleteBuffers(1, &buffer);
-}
-
-void GraphicsContext3D::deleteFramebuffer(unsigned framebuffer)
-{
- makeContextCurrent();
- glDeleteFramebuffersEXT(1, &framebuffer);
-}
-
-void GraphicsContext3D::deleteProgram(unsigned program)
-{
- makeContextCurrent();
- glDeleteProgram(program);
-}
-
-void GraphicsContext3D::deleteRenderbuffer(unsigned renderbuffer)
-{
- makeContextCurrent();
- glDeleteRenderbuffersEXT(1, &renderbuffer);
-}
-
-void GraphicsContext3D::deleteShader(unsigned shader)
-{
- makeContextCurrent();
- glDeleteShader(shader);
-}
-
-void GraphicsContext3D::deleteTexture(unsigned texture)
-{
- makeContextCurrent();
- glDeleteTextures(1, &texture);
-}
-
-void GraphicsContext3D::activeTexture(unsigned long texture)
-{
- m_internal->activeTexture(texture);
-}
-
-GL_SAME_METHOD_2_X12(AttachShader, attachShader, WebGLProgram*, WebGLShader*)
-
-void GraphicsContext3D::bindAttribLocation(WebGLProgram* program,
- unsigned long index,
- const String& name)
-{
- if (!program)
- return;
- makeContextCurrent();
- glBindAttribLocation(EXTRACT(program), index, name.utf8().data());
-}
-
-void GraphicsContext3D::bindBuffer(unsigned long target,
- WebGLBuffer* buffer)
-{
- m_internal->bindBuffer(target, buffer);
-}
-
-void GraphicsContext3D::bindFramebuffer(unsigned long target, WebGLFramebuffer* framebuffer)
-{
- m_internal->bindFramebuffer(target, framebuffer);
-}
-
-GL_SAME_METHOD_2_X2(BindRenderbufferEXT, bindRenderbuffer, unsigned long, WebGLRenderbuffer*)
-
-// If we didn't have to hack GL_TEXTURE_WRAP_R for cube maps,
-// we could just use:
-// GL_SAME_METHOD_2_X2(BindTexture, bindTexture, unsigned long, WebGLTexture*)
-void GraphicsContext3D::bindTexture(unsigned long target,
- WebGLTexture* texture)
-{
- m_internal->bindTexture(target, texture);
-}
-
-GL_SAME_METHOD_4(BlendColor, blendColor, double, double, double, double)
-
-GL_SAME_METHOD_1(BlendEquation, blendEquation, unsigned long)
-
-GL_SAME_METHOD_2(BlendEquationSeparate, blendEquationSeparate, unsigned long, unsigned long)
-
-GL_SAME_METHOD_2(BlendFunc, blendFunc, unsigned long, unsigned long)
-
-GL_SAME_METHOD_4(BlendFuncSeparate, blendFuncSeparate, unsigned long, unsigned long, unsigned long, unsigned long)
-
-void GraphicsContext3D::bufferData(unsigned long target, int size, unsigned long usage)
-{
- m_internal->bufferDataImpl(target, size, 0, usage);
-}
-
-void GraphicsContext3D::bufferData(unsigned long target, WebGLArray* array, unsigned long usage)
-{
- m_internal->bufferDataImpl(target, array->byteLength(), array->baseAddress(), usage);
-}
-
-void GraphicsContext3D::bufferSubData(unsigned long target, long offset, WebGLArray* array)
-{
- if (!array || !array->length())
- return;
-
- makeContextCurrent();
- // FIXME: make this verification more efficient.
- GLint binding = 0;
- GLenum binding_target = GL_ARRAY_BUFFER_BINDING;
- if (target == GL_ELEMENT_ARRAY_BUFFER)
- binding_target = GL_ELEMENT_ARRAY_BUFFER_BINDING;
- glGetIntegerv(binding_target, &binding);
- if (binding <= 0) {
- // FIXME: raise exception.
- // LogMessagef(("bufferSubData: no buffer bound"));
- return;
- }
- glBufferSubData(target, offset, array->byteLength(), array->baseAddress());
-}
-
-unsigned long GraphicsContext3D::checkFramebufferStatus(unsigned long target)
-{
- makeContextCurrent();
- return glCheckFramebufferStatusEXT(target);
-}
-
-GL_SAME_METHOD_1(Clear, clear, unsigned long)
-
-GL_SAME_METHOD_4(ClearColor, clearColor, double, double, double, double)
-
-GL_SAME_METHOD_1(ClearDepth, clearDepth, double)
-
-GL_SAME_METHOD_1(ClearStencil, clearStencil, long)
-
-GL_SAME_METHOD_4(ColorMask, colorMask, bool, bool, bool, bool)
-
-GL_SAME_METHOD_1_X(CompileShader, compileShader, WebGLShader*)
-
-GL_SAME_METHOD_8(CopyTexImage2D, copyTexImage2D, unsigned long, long, unsigned long, long, long, unsigned long, unsigned long, long)
-
-GL_SAME_METHOD_8(CopyTexSubImage2D, copyTexSubImage2D, unsigned long, long, long, long, long, long, unsigned long, unsigned long)
-
-GL_SAME_METHOD_1(CullFace, cullFace, unsigned long)
-
-GL_SAME_METHOD_1(DepthFunc, depthFunc, unsigned long)
-
-GL_SAME_METHOD_1(DepthMask, depthMask, bool)
-
-GL_SAME_METHOD_2(DepthRange, depthRange, double, double)
-
-void GraphicsContext3D::detachShader(WebGLProgram* program, WebGLShader* shader)
-{
- if (!program || !shader)
- return;
-
- makeContextCurrent();
- glDetachShader(EXTRACT(program), EXTRACT(shader));
-}
-
-GL_SAME_METHOD_1(Disable, disable, unsigned long)
-
-void GraphicsContext3D::disableVertexAttribArray(unsigned long index)
-{
- m_internal->disableVertexAttribArray(index);
-}
-
-void GraphicsContext3D::drawArrays(unsigned long mode, long first, long count)
-{
- switch (mode) {
- case GL_TRIANGLES:
- case GL_TRIANGLE_STRIP:
- case GL_TRIANGLE_FAN:
- case GL_POINTS:
- case GL_LINE_STRIP:
- case GL_LINE_LOOP:
- case GL_LINES:
- break;
- default: // FIXME: default cases are discouraged in WebKit.
- // FIXME: output log message, raise exception.
- // LogMessage(NS_LITERAL_CSTRING("drawArrays: invalid mode"));
- // return NS_ERROR_DOM_SYNTAX_ERR;
- return;
- }
-
- if (first+count < first || first+count < count) {
- // FIXME: output log message, raise exception.
- // LogMessage(NS_LITERAL_CSTRING("drawArrays: overflow in first+count"));
- // return NS_ERROR_INVALID_ARG;
- return;
- }
-
- // FIXME: validate against currently bound buffer.
- // if (!ValidateBuffers(first+count))
- // return NS_ERROR_INVALID_ARG;
-
- makeContextCurrent();
- glDrawArrays(mode, first, count);
-}
-
-void GraphicsContext3D::drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset)
-{
- makeContextCurrent();
- // FIXME: make this verification more efficient.
- GLint binding = 0;
- GLenum binding_target = GL_ELEMENT_ARRAY_BUFFER_BINDING;
- glGetIntegerv(binding_target, &binding);
- if (binding <= 0) {
- // FIXME: raise exception.
- // LogMessagef(("bufferData: no buffer bound"));
- return;
- }
- glDrawElements(mode, count, type,
- reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
-}
-
-GL_SAME_METHOD_1(Enable, enable, unsigned long)
-
-void GraphicsContext3D::enableVertexAttribArray(unsigned long index)
-{
- m_internal->enableVertexAttribArray(index);
-}
-
-GL_SAME_METHOD_0(Finish, finish)
-
-GL_SAME_METHOD_0(Flush, flush)
-
-GL_SAME_METHOD_4_X4(FramebufferRenderbufferEXT, framebufferRenderbuffer, unsigned long, unsigned long, unsigned long, WebGLRenderbuffer*)
-
-GL_SAME_METHOD_5_X4(FramebufferTexture2DEXT, framebufferTexture2D, unsigned long, unsigned long, unsigned long, WebGLTexture*, long)
-
-GL_SAME_METHOD_1(FrontFace, frontFace, unsigned long)
-
-void GraphicsContext3D::generateMipmap(unsigned long target)
-{
- makeContextCurrent();
- if (glGenerateMipmapEXT)
- glGenerateMipmapEXT(target);
- // FIXME: provide alternative code path? This will be unpleasant
- // to implement if glGenerateMipmapEXT is not available -- it will
- // require a texture readback and re-upload.
-}
-
-bool GraphicsContext3D::getActiveAttrib(WebGLProgram* program, unsigned long index, ActiveInfo& info)
-{
- if (!program) {
- synthesizeGLError(INVALID_VALUE);
- return false;
- }
- GLint maxNameLength = -1;
- glGetProgramiv(EXTRACT(program), GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxNameLength);
- if (maxNameLength < 0)
- return false;
- GLchar* name = 0;
- if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) {
- synthesizeGLError(OUT_OF_MEMORY);
- return false;
- }
- GLsizei length = 0;
- GLint size = -1;
- GLenum type = 0;
- glGetActiveAttrib(EXTRACT(program), index, maxNameLength,
- &length, &size, &type, name);
- if (size < 0) {
- fastFree(name);
- return false;
- }
- info.name = String(name, length);
- info.type = type;
- info.size = size;
- fastFree(name);
- return true;
-}
-
-bool GraphicsContext3D::getActiveUniform(WebGLProgram* program, unsigned long index, ActiveInfo& info)
-{
- if (!program) {
- synthesizeGLError(INVALID_VALUE);
- return false;
- }
- GLint maxNameLength = -1;
- glGetProgramiv(EXTRACT(program), GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength);
- if (maxNameLength < 0)
- return false;
- GLchar* name = 0;
- if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) {
- synthesizeGLError(OUT_OF_MEMORY);
- return false;
- }
- GLsizei length = 0;
- GLint size = -1;
- GLenum type = 0;
- glGetActiveUniform(EXTRACT(program), index, maxNameLength,
- &length, &size, &type, name);
- if (size < 0) {
- fastFree(name);
- return false;
- }
- info.name = String(name, length);
- info.type = type;
- info.size = size;
- fastFree(name);
- return true;
-}
-
-int GraphicsContext3D::getAttribLocation(WebGLProgram* program, const String& name)
-{
- if (!program)
- return -1;
-
- makeContextCurrent();
- return glGetAttribLocation(EXTRACT(program), name.utf8().data());
-}
-
-void GraphicsContext3D::getBooleanv(unsigned long pname, unsigned char* value)
-{
- makeContextCurrent();
- glGetBooleanv(pname, value);
-}
-
-void GraphicsContext3D::getBufferParameteriv(unsigned long target, unsigned long pname, int* value)
-{
- makeContextCurrent();
- glGetBufferParameteriv(target, pname, value);
-}
-
-GraphicsContext3D::Attributes GraphicsContext3D::getContextAttributes()
-{
- return m_internal->getContextAttributes();
-}
-
-unsigned long GraphicsContext3D::getError()
-{
- return m_internal->getError();
-}
-
-void GraphicsContext3D::getFloatv(unsigned long pname, float* value)
-{
- makeContextCurrent();
- glGetFloatv(pname, value);
-}
-
-void GraphicsContext3D::getFramebufferAttachmentParameteriv(unsigned long target,
- unsigned long attachment,
- unsigned long pname,
- int* value)
-{
- makeContextCurrent();
- glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, value);
-}
-
-void GraphicsContext3D::getIntegerv(unsigned long pname, int* value)
-{
- makeContextCurrent();
- glGetIntegerv(pname, value);
-}
-
-void GraphicsContext3D::getProgramiv(WebGLProgram* program,
- unsigned long pname,
- int* value)
-{
- makeContextCurrent();
- glGetProgramiv(EXTRACT(program), pname, value);
-}
-
-String GraphicsContext3D::getProgramInfoLog(WebGLProgram* program)
-{
- makeContextCurrent();
- GLuint programID = EXTRACT(program);
- GLint logLength;
- glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &logLength);
- if (!logLength)
- return String();
- GLchar* log = 0;
- if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log))
- return String();
- GLsizei returnedLogLength;
- glGetProgramInfoLog(programID, logLength, &returnedLogLength, log);
- ASSERT(logLength == returnedLogLength + 1);
- String res = String(log, returnedLogLength);
- fastFree(log);
- return res;
-}
-
-void GraphicsContext3D::getRenderbufferParameteriv(unsigned long target,
- unsigned long pname,
- int* value)
-{
- makeContextCurrent();
- glGetRenderbufferParameterivEXT(target, pname, value);
-}
-
-void GraphicsContext3D::getShaderiv(WebGLShader* shader,
- unsigned long pname,
- int* value)
-{
- makeContextCurrent();
- glGetShaderiv(EXTRACT(shader), pname, value);
-}
-
-String GraphicsContext3D::getShaderInfoLog(WebGLShader* shader)
-{
- makeContextCurrent();
- GLuint shaderID = EXTRACT(shader);
- GLint logLength;
- glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLength);
- if (!logLength)
- return String();
- GLchar* log = 0;
- if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log))
- return String();
- GLsizei returnedLogLength;
- glGetShaderInfoLog(shaderID, logLength, &returnedLogLength, log);
- ASSERT(logLength == returnedLogLength + 1);
- String res = String(log, returnedLogLength);
- fastFree(log);
- return res;
-}
-
-String GraphicsContext3D::getShaderSource(WebGLShader* shader)
-{
- makeContextCurrent();
- GLuint shaderID = EXTRACT(shader);
- GLint logLength;
- glGetShaderiv(shaderID, GL_SHADER_SOURCE_LENGTH, &logLength);
- if (!logLength)
- return String();
- GLchar* log = 0;
- if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log))
- return String();
- GLsizei returnedLogLength;
- glGetShaderSource(shaderID, logLength, &returnedLogLength, log);
- ASSERT(logLength == returnedLogLength + 1);
- String res = String(log, returnedLogLength);
- fastFree(log);
- return res;
-}
-
-String GraphicsContext3D::getString(unsigned long name)
-{
- makeContextCurrent();
- return String(reinterpret_cast<const char*>(glGetString(name)));
-}
-
-void GraphicsContext3D::getTexParameterfv(unsigned long target, unsigned long pname, float* value)
-{
- makeContextCurrent();
- glGetTexParameterfv(target, pname, value);
-}
-
-void GraphicsContext3D::getTexParameteriv(unsigned long target, unsigned long pname, int* value)
-{
- makeContextCurrent();
- glGetTexParameteriv(target, pname, value);
-}
-
-void GraphicsContext3D::getUniformfv(WebGLProgram* program, long location, float* value)
-{
- makeContextCurrent();
- glGetUniformfv(EXTRACT(program), location, value);
-}
-
-void GraphicsContext3D::getUniformiv(WebGLProgram* program, long location, int* value)
-{
- makeContextCurrent();
- glGetUniformiv(EXTRACT(program), location, value);
-}
-
-long GraphicsContext3D::getUniformLocation(WebGLProgram* program, const String& name)
-{
- if (!program)
- return -1;
-
- makeContextCurrent();
- return glGetUniformLocation(EXTRACT(program), name.utf8().data());
-}
-
-void GraphicsContext3D::getVertexAttribfv(unsigned long index,
- unsigned long pname,
- float* value)
-{
- makeContextCurrent();
- glGetVertexAttribfv(index, pname, value);
-}
-
-void GraphicsContext3D::getVertexAttribiv(unsigned long index,
- unsigned long pname,
- int* value)
-{
- makeContextCurrent();
- glGetVertexAttribiv(index, pname, value);
-}
-
-long GraphicsContext3D::getVertexAttribOffset(unsigned long index, unsigned long pname)
-{
- // FIXME: implement.
- notImplemented();
- return 0;
-}
-
-GL_SAME_METHOD_2(Hint, hint, unsigned long, unsigned long);
-
-bool GraphicsContext3D::isBuffer(WebGLBuffer* buffer)
-{
- makeContextCurrent();
- return glIsBuffer(EXTRACT(buffer));
-}
-
-bool GraphicsContext3D::isEnabled(unsigned long cap)
-{
- makeContextCurrent();
- return glIsEnabled(cap);
-}
-
-bool GraphicsContext3D::isFramebuffer(WebGLFramebuffer* framebuffer)
-{
- makeContextCurrent();
- return glIsFramebufferEXT(EXTRACT(framebuffer));
-}
-
-bool GraphicsContext3D::isProgram(WebGLProgram* program)
-{
- makeContextCurrent();
- return glIsProgram(EXTRACT(program));
-}
-
-bool GraphicsContext3D::isRenderbuffer(WebGLRenderbuffer* renderbuffer)
-{
- makeContextCurrent();
- return glIsRenderbufferEXT(EXTRACT(renderbuffer));
-}
-
-bool GraphicsContext3D::isShader(WebGLShader* shader)
-{
- makeContextCurrent();
- return glIsShader(EXTRACT(shader));
-}
-
-bool GraphicsContext3D::isTexture(WebGLTexture* texture)
-{
- makeContextCurrent();
- return glIsTexture(EXTRACT(texture));
-}
-
-GL_SAME_METHOD_1(LineWidth, lineWidth, double)
-
-GL_SAME_METHOD_1_X(LinkProgram, linkProgram, WebGLProgram*)
-
-void GraphicsContext3D::pixelStorei(unsigned long pname, long param)
-{
- if (pname != GL_PACK_ALIGNMENT && pname != GL_UNPACK_ALIGNMENT) {
- // FIXME: Create a fake GL error and throw an exception.
- return;
- }
-
- makeContextCurrent();
- glPixelStorei(pname, param);
-}
-
-GL_SAME_METHOD_2(PolygonOffset, polygonOffset, double, double)
-
-PassRefPtr<WebGLArray> GraphicsContext3D::readPixels(long x, long y,
- unsigned long width, unsigned long height,
- unsigned long format, unsigned long type) {
- // FIXME: support more pixel formats and types.
- if (!((format == GL_RGBA) && (type == GL_UNSIGNED_BYTE)))
- return 0;
-
- // FIXME: take into account pack alignment.
- RefPtr<WebGLUnsignedByteArray> array = WebGLUnsignedByteArray::create(width * height * 4);
- glReadPixels(x, y, width, height, format, type, array->baseAddress());
- return array;
-}
-
-void GraphicsContext3D::releaseShaderCompiler()
-{
-}
-
-GL_SAME_METHOD_4(RenderbufferStorageEXT, renderbufferStorage, unsigned long, unsigned long, unsigned long, unsigned long)
-
-GL_SAME_METHOD_2(SampleCoverage, sampleCoverage, double, bool)
-
-GL_SAME_METHOD_4(Scissor, scissor, long, long, unsigned long, unsigned long)
-
-void GraphicsContext3D::shaderSource(WebGLShader* shader, const String& source)
-{
- makeContextCurrent();
- CString str = source.utf8();
- const char* data = str.data();
- GLint length = str.length();
- glShaderSource(EXTRACT(shader), 1, &data, &length);
-}
-
-GL_SAME_METHOD_3(StencilFunc, stencilFunc, unsigned long, long, unsigned long)
-
-GL_SAME_METHOD_4(StencilFuncSeparate, stencilFuncSeparate, unsigned long, unsigned long, long, unsigned long)
-
-GL_SAME_METHOD_1(StencilMask, stencilMask, unsigned long)
-
-GL_SAME_METHOD_2(StencilMaskSeparate, stencilMaskSeparate, unsigned long, unsigned long)
-
-GL_SAME_METHOD_3(StencilOp, stencilOp, unsigned long, unsigned long, unsigned long)
-
-GL_SAME_METHOD_4(StencilOpSeparate, stencilOpSeparate, unsigned long, unsigned long, unsigned long, unsigned long)
-
-void GraphicsContext3D::synthesizeGLError(unsigned long error)
-{
- m_internal->synthesizeGLError(error);
-}
-
-int GraphicsContext3D::texImage2D(unsigned target,
- unsigned level,
- unsigned internalformat,
- unsigned width,
- unsigned height,
- unsigned border,
- unsigned format,
- unsigned type,
- void* pixels)
-{
- // FIXME: must do validation similar to JOGL's to ensure that
- // the incoming array is of the appropriate length.
- glTexImage2D(target,
- level,
- internalformat,
- width,
- height,
- border,
- format,
- type,
- pixels);
- return 0;
-}
-
-// Remove premultiplied alpha from color channels.
-// FIXME: this is lossy. Must retrieve original values from HTMLImageElement.
-static void unmultiplyAlpha(unsigned char* rgbaData, int numPixels)
-{
- for (int j = 0; j < numPixels; j++) {
- float b = rgbaData[4*j+0] / 255.0f;
- float g = rgbaData[4*j+1] / 255.0f;
- float r = rgbaData[4*j+2] / 255.0f;
- float a = rgbaData[4*j+3] / 255.0f;
- if (a > 0.0f) {
- b /= a;
- g /= a;
- r /= a;
- b = (b > 1.0f) ? 1.0f : b;
- g = (g > 1.0f) ? 1.0f : g;
- r = (r > 1.0f) ? 1.0f : r;
- rgbaData[4*j+0] = (unsigned char) (b * 255.0f);
- rgbaData[4*j+1] = (unsigned char) (g * 255.0f);
- rgbaData[4*j+2] = (unsigned char) (r * 255.0f);
- }
- }
-}
-
-// FIXME: this must be changed to refer to the original image data
-// rather than unmultiplying the alpha channel.
-static int texImage2DHelper(unsigned target, unsigned level,
- int width, int height,
- int rowBytes,
- bool flipY,
- bool premultiplyAlpha,
- GLenum format,
- bool skipAlpha,
- unsigned char* pixels)
-{
- ASSERT(format == GL_RGBA || format == GL_BGRA);
- GLint internalFormat = GL_RGBA8;
- if (skipAlpha) {
- internalFormat = GL_RGB8;
- // Ignore the alpha channel
- premultiplyAlpha = true;
- }
- if (flipY) {
- // Need to flip images vertically. To avoid making a copy of
- // the entire image, we perform a ton of glTexSubImage2D
- // calls. FIXME: should rethink this strategy for efficiency.
- glTexImage2D(target, level, internalFormat,
- width,
- height,
- 0,
- format,
- GL_UNSIGNED_BYTE,
- 0);
- unsigned char* row = 0;
- bool allocatedRow = false;
- if (!premultiplyAlpha) {
- row = new unsigned char[rowBytes];
- allocatedRow = true;
- }
- for (int i = 0; i < height; i++) {
- if (premultiplyAlpha)
- row = pixels + (rowBytes * i);
- else {
- memcpy(row, pixels + (rowBytes * i), rowBytes);
- unmultiplyAlpha(row, width);
- }
- glTexSubImage2D(target, level, 0, height - i - 1,
- width, 1,
- format,
- GL_UNSIGNED_BYTE,
- row);
- }
- if (allocatedRow)
- delete[] row;
- } else {
- // The pixels of cube maps' faces are defined with a top-down
- // scanline ordering, unlike GL_TEXTURE_2D, so when uploading
- // these, the above vertical flip is the wrong thing to do.
- if (premultiplyAlpha)
- glTexImage2D(target, level, internalFormat,
- width,
- height,
- 0,
- format,
- GL_UNSIGNED_BYTE,
- pixels);
- else {
- glTexImage2D(target, level, internalFormat,
- width,
- height,
- 0,
- format,
- GL_UNSIGNED_BYTE,
- 0);
- unsigned char* row = new unsigned char[rowBytes];
- for (int i = 0; i < height; i++) {
- memcpy(row, pixels + (rowBytes * i), rowBytes);
- unmultiplyAlpha(row, width);
- glTexSubImage2D(target, level, 0, i,
- width, 1,
- format,
- GL_UNSIGNED_BYTE,
- row);
- }
- delete[] row;
- }
- }
- return 0;
-}
-
-int GraphicsContext3D::texImage2D(unsigned target, unsigned level, Image* image,
- bool flipY, bool premultiplyAlpha)
-{
- ASSERT(image);
-
- int res = -1;
-#if PLATFORM(SKIA)
- NativeImageSkia* skiaImage = image->nativeImageForCurrentFrame();
- if (!skiaImage) {
- ASSERT_NOT_REACHED();
- return -1;
- }
- SkBitmap::Config skiaConfig = skiaImage->config();
- // FIXME: must support more image configurations.
- if (skiaConfig != SkBitmap::kARGB_8888_Config) {
- ASSERT_NOT_REACHED();
- return -1;
- }
- SkBitmap& skiaImageRef = *skiaImage;
- SkAutoLockPixels lock(skiaImageRef);
- int width = skiaImage->width();
- int height = skiaImage->height();
- unsigned char* pixels =
- reinterpret_cast<unsigned char*>(skiaImage->getPixels());
- int rowBytes = skiaImage->rowBytes();
- res = texImage2DHelper(target, level,
- width, height,
- rowBytes,
- flipY, premultiplyAlpha,
- GL_BGRA,
- false,
- pixels);
-#elif PLATFORM(CG)
- CGImageRef cgImage = image->nativeImageForCurrentFrame();
- if (!cgImage) {
- ASSERT_NOT_REACHED();
- return -1;
- }
- int width = CGImageGetWidth(cgImage);
- int height = CGImageGetHeight(cgImage);
- int rowBytes = width * 4;
- CGImageAlphaInfo info = CGImageGetAlphaInfo(cgImage);
- bool skipAlpha = (info == kCGImageAlphaNone
- || info == kCGImageAlphaNoneSkipLast
- || info == kCGImageAlphaNoneSkipFirst);
- unsigned char* imageData = new unsigned char[height * rowBytes];
- CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
- CGContextRef tmpContext = CGBitmapContextCreate(imageData, width, height, 8, rowBytes,
- colorSpace,
- kCGImageAlphaPremultipliedLast);
- CGColorSpaceRelease(colorSpace);
- CGContextSetBlendMode(tmpContext, kCGBlendModeCopy);
- CGContextDrawImage(tmpContext,
- CGRectMake(0, 0, static_cast<CGFloat>(width), static_cast<CGFloat>(height)),
- cgImage);
- CGContextRelease(tmpContext);
- res = texImage2DHelper(target, level, width, height, rowBytes,
- flipY, premultiplyAlpha, GL_RGBA, skipAlpha, imageData);
- delete[] imageData;
-#else
-#error Must port to your platform
-#endif
- return res;
-}
-
-GL_SAME_METHOD_3(TexParameterf, texParameterf, unsigned, unsigned, float);
-
-GL_SAME_METHOD_3(TexParameteri, texParameteri, unsigned, unsigned, int);
-
-int GraphicsContext3D::texSubImage2D(unsigned target,
- unsigned level,
- unsigned xoffset,
- unsigned yoffset,
- unsigned width,
- unsigned height,
- unsigned format,
- unsigned type,
- void* pixels)
-{
- glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
- return 0;
-}
-
-int GraphicsContext3D::texSubImage2D(unsigned target,
- unsigned level,
- unsigned xoffset,
- unsigned yoffset,
- Image* image,
- bool flipY,
- bool premultiplyAlpha)
-{
- // FIXME: implement.
- notImplemented();
- return -1;
-}
-
-GL_SAME_METHOD_2(Uniform1f, uniform1f, long, float)
-
-void GraphicsContext3D::uniform1fv(long location, float* v, int size)
-{
- makeContextCurrent();
- glUniform1fv(location, size, v);
-}
-
-GL_SAME_METHOD_2(Uniform1i, uniform1i, long, int)
-
-void GraphicsContext3D::uniform1iv(long location, int* v, int size)
-{
- makeContextCurrent();
- glUniform1iv(location, size, v);
-}
-
-GL_SAME_METHOD_3(Uniform2f, uniform2f, long, float, float)
-
-void GraphicsContext3D::uniform2fv(long location, float* v, int size)
-{
- makeContextCurrent();
- glUniform2fv(location, size, v);
-}
-
-GL_SAME_METHOD_3(Uniform2i, uniform2i, long, int, int)
-
-void GraphicsContext3D::uniform2iv(long location, int* v, int size)
-{
- makeContextCurrent();
- glUniform2iv(location, size, v);
-}
-
-GL_SAME_METHOD_4(Uniform3f, uniform3f, long, float, float, float)
-
-void GraphicsContext3D::uniform3fv(long location, float* v, int size)
-{
- makeContextCurrent();
- glUniform3fv(location, size, v);
-}
-
-GL_SAME_METHOD_4(Uniform3i, uniform3i, long, int, int, int)
-
-void GraphicsContext3D::uniform3iv(long location, int* v, int size)
-{
- makeContextCurrent();
- glUniform3iv(location, size, v);
-}
-
-GL_SAME_METHOD_5(Uniform4f, uniform4f, long, float, float, float, float)
-
-void GraphicsContext3D::uniform4fv(long location, float* v, int size)
-{
- makeContextCurrent();
- glUniform4fv(location, size, v);
-}
-
-GL_SAME_METHOD_5(Uniform4i, uniform4i, long, int, int, int, int)
-
-void GraphicsContext3D::uniform4iv(long location, int* v, int size)
-{
- makeContextCurrent();
- glUniform4iv(location, size, v);
-}
-
-void GraphicsContext3D::uniformMatrix2fv(long location, bool transpose, float* value, int size)
-{
- makeContextCurrent();
- glUniformMatrix2fv(location, size, transpose, value);
-}
-
-void GraphicsContext3D::uniformMatrix3fv(long location, bool transpose, float* value, int size)
-{
- makeContextCurrent();
- glUniformMatrix3fv(location, size, transpose, value);
-}
-
-void GraphicsContext3D::uniformMatrix4fv(long location, bool transpose, float* value, int size)
-{
- makeContextCurrent();
- glUniformMatrix4fv(location, size, transpose, value);
-}
-
-GL_SAME_METHOD_1_X(UseProgram, useProgram, WebGLProgram*)
-
-GL_SAME_METHOD_1_X(ValidateProgram, validateProgram, WebGLProgram*)
-
-GL_SAME_METHOD_2(VertexAttrib1f, vertexAttrib1f, unsigned long, float)
-
-void GraphicsContext3D::vertexAttrib1fv(unsigned long indx, float* values)
-{
- makeContextCurrent();
- glVertexAttrib1fv(indx, values);
-}
-
-GL_SAME_METHOD_3(VertexAttrib2f, vertexAttrib2f, unsigned long, float, float)
-
-void GraphicsContext3D::vertexAttrib2fv(unsigned long indx, float* values)
-{
- makeContextCurrent();
- glVertexAttrib2fv(indx, values);
-}
-
-GL_SAME_METHOD_4(VertexAttrib3f, vertexAttrib3f, unsigned long, float, float, float)
-
-void GraphicsContext3D::vertexAttrib3fv(unsigned long indx, float* values)
-{
- makeContextCurrent();
- glVertexAttrib3fv(indx, values);
-}
-
-GL_SAME_METHOD_5(VertexAttrib4f, vertexAttrib4f, unsigned long, float, float, float, float)
-
-void GraphicsContext3D::vertexAttrib4fv(unsigned long indx, float* values)
-{
- makeContextCurrent();
- glVertexAttrib4fv(indx, values);
-}
-
-void GraphicsContext3D::vertexAttribPointer(unsigned long indx, int size, int type, bool normalized,
- unsigned long stride, unsigned long offset)
-{
- m_internal->vertexAttribPointer(indx, size, type, normalized, stride, offset);
-}
-
-void GraphicsContext3D::viewport(long x, long y, unsigned long width, unsigned long height)
-{
- makeContextCurrent();
- m_internal->viewportImpl(x, y, width, height);
-}
-
-}
-
-#endif // ENABLE(3D_CANVAS)
diff --git a/WebKit/chromium/src/GraphicsContext3DChromium.cpp b/WebKit/chromium/src/GraphicsContext3DChromium.cpp
new file mode 100644
index 0000000..cc0c5bc
--- /dev/null
+++ b/WebKit/chromium/src/GraphicsContext3DChromium.cpp
@@ -0,0 +1,1051 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+
+#if ENABLE(3D_CANVAS)
+
+#include "GraphicsContext3D.h"
+
+#include "CachedImage.h"
+#include "WebGLLayerChromium.h"
+#include "CanvasRenderingContext.h"
+#include "Chrome.h"
+#include "ChromeClientImpl.h"
+#include "Extensions3DChromium.h"
+#include "GraphicsContext3DInternal.h"
+#include "HTMLCanvasElement.h"
+#include "HTMLImageElement.h"
+#include "ImageBuffer.h"
+#include "ImageData.h"
+#include "WebGraphicsContext3D.h"
+#include "WebGraphicsContext3DDefaultImpl.h"
+#include "WebKit.h"
+#include "WebKitClient.h"
+#include "WebViewImpl.h"
+
+#include <stdio.h>
+#include <wtf/FastMalloc.h>
+#include <wtf/text/CString.h>
+
+#if PLATFORM(CG)
+#include "GraphicsContext.h"
+#include "WebGLRenderingContext.h"
+#include <CoreGraphics/CGContext.h>
+#include <CoreGraphics/CGImage.h>
+#endif
+
+// There are two levels of delegation in this file:
+//
+// 1. GraphicsContext3D delegates to GraphicsContext3DInternal. This is done
+// so that we have some place to store data members common among
+// implementations; GraphicsContext3D only provides us the m_internal
+// pointer. We always delegate to the GraphicsContext3DInternal. While we
+// could sidestep it and go directly to the WebGraphicsContext3D in some
+// cases, it is better for consistency to always delegate through it.
+//
+// 2. GraphicsContext3DInternal delegates to an implementation of
+// WebGraphicsContext3D. This is done so we have a place to inject an
+// implementation which remotes the OpenGL calls across processes.
+//
+// The legacy, in-process, implementation uses WebGraphicsContext3DDefaultImpl.
+
+namespace WebCore {
+
+//----------------------------------------------------------------------
+// GraphicsContext3DInternal
+
+GraphicsContext3DInternal::GraphicsContext3DInternal()
+ : m_webViewImpl(0)
+ , m_initializedAvailableExtensions(false)
+#if PLATFORM(SKIA)
+#elif PLATFORM(CG)
+ , m_renderOutput(0)
+#else
+#error Must port to your platform
+#endif
+{
+}
+
+GraphicsContext3DInternal::~GraphicsContext3DInternal()
+{
+#if PLATFORM(CG)
+ if (m_renderOutput)
+ delete[] m_renderOutput;
+#endif
+}
+
+bool GraphicsContext3DInternal::initialize(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool renderDirectlyToHostWindow)
+{
+ WebKit::WebGraphicsContext3D::Attributes webAttributes;
+ webAttributes.alpha = attrs.alpha;
+ webAttributes.depth = attrs.depth;
+ webAttributes.stencil = attrs.stencil;
+ webAttributes.antialias = attrs.antialias;
+ webAttributes.premultipliedAlpha = attrs.premultipliedAlpha;
+ webAttributes.canRecoverFromContextLoss = attrs.canRecoverFromContextLoss;
+ WebKit::WebGraphicsContext3D* webContext = WebKit::webKitClient()->createGraphicsContext3D();
+ if (!webContext)
+ return false;
+
+ Chrome* chrome = static_cast<Chrome*>(hostWindow);
+ WebKit::ChromeClientImpl* chromeClientImpl = static_cast<WebKit::ChromeClientImpl*>(chrome->client());
+
+ m_webViewImpl = chromeClientImpl->webView();
+
+ if (!m_webViewImpl)
+ return false;
+ if (!webContext->initialize(webAttributes, m_webViewImpl, renderDirectlyToHostWindow)) {
+ delete webContext;
+ return false;
+ }
+ m_impl.set(webContext);
+
+#if USE(ACCELERATED_COMPOSITING)
+ m_compositingLayer = WebGLLayerChromium::create(0);
+#endif
+ return true;
+}
+
+WebKit::WebGraphicsContext3D* GraphicsContext3DInternal::extractWebGraphicsContext3D(GraphicsContext3D* context)
+{
+ if (!context)
+ return 0;
+ return context->m_internal->m_impl.get();
+}
+
+PlatformGraphicsContext3D GraphicsContext3DInternal::platformGraphicsContext3D() const
+{
+ return m_impl.get();
+}
+
+Platform3DObject GraphicsContext3DInternal::platformTexture() const
+{
+ return m_impl->getPlatformTextureId();
+}
+
+void GraphicsContext3DInternal::prepareTexture()
+{
+ m_impl->prepareTexture();
+}
+
+#if USE(ACCELERATED_COMPOSITING)
+WebGLLayerChromium* GraphicsContext3DInternal::platformLayer() const
+{
+ return m_compositingLayer.get();
+}
+#endif
+
+void GraphicsContext3DInternal::paintRenderingResultsToCanvas(CanvasRenderingContext* context)
+{
+ HTMLCanvasElement* canvas = context->canvas();
+ ImageBuffer* imageBuffer = canvas->buffer();
+ unsigned char* pixels = 0;
+#if PLATFORM(SKIA)
+ const SkBitmap* canvasBitmap = imageBuffer->context()->platformContext()->bitmap();
+ const SkBitmap* readbackBitmap = 0;
+ ASSERT(canvasBitmap->config() == SkBitmap::kARGB_8888_Config);
+ if (canvasBitmap->width() == m_impl->width() && canvasBitmap->height() == m_impl->height()) {
+ // This is the fastest and most common case. We read back
+ // directly into the canvas's backing store.
+ readbackBitmap = canvasBitmap;
+ m_resizingBitmap.reset();
+ } else {
+ // We need to allocate a temporary bitmap for reading back the
+ // pixel data. We will then use Skia to rescale this bitmap to
+ // the size of the canvas's backing store.
+ if (m_resizingBitmap.width() != m_impl->width() || m_resizingBitmap.height() != m_impl->height()) {
+ m_resizingBitmap.setConfig(SkBitmap::kARGB_8888_Config,
+ m_impl->width(),
+ m_impl->height());
+ if (!m_resizingBitmap.allocPixels())
+ return;
+ }
+ readbackBitmap = &m_resizingBitmap;
+ }
+
+ // Read back the frame buffer.
+ SkAutoLockPixels bitmapLock(*readbackBitmap);
+ pixels = static_cast<unsigned char*>(readbackBitmap->getPixels());
+#elif PLATFORM(CG)
+ if (m_renderOutput)
+ pixels = m_renderOutput;
+#else
+#error Must port to your platform
+#endif
+
+ m_impl->readBackFramebuffer(pixels, 4 * m_impl->width() * m_impl->height());
+
+#if PLATFORM(SKIA)
+ if (m_resizingBitmap.readyToDraw()) {
+ // We need to draw the resizing bitmap into the canvas's backing store.
+ SkCanvas canvas(*canvasBitmap);
+ SkRect dst;
+ dst.set(SkIntToScalar(0), SkIntToScalar(0), canvasBitmap->width(), canvasBitmap->height());
+ canvas.drawBitmapRect(m_resizingBitmap, 0, dst);
+ }
+#elif PLATFORM(CG)
+ if (m_renderOutput && context->is3d()) {
+ WebGLRenderingContext* webGLContext = static_cast<WebGLRenderingContext*>(context);
+ webGLContext->graphicsContext3D()->paintToCanvas(m_renderOutput, m_impl->width(), m_impl->height(), canvas->width(), canvas->height(), imageBuffer->context()->platformContext());
+ }
+#else
+#error Must port to your platform
+#endif
+}
+
+bool GraphicsContext3DInternal::paintsIntoCanvasBuffer() const
+{
+ // If the gpu compositor is on then skip the readback and software rendering path.
+ return !m_webViewImpl->isAcceleratedCompositingActive();
+}
+
+void GraphicsContext3DInternal::reshape(int width, int height)
+{
+ if (width == m_impl->width() && height == m_impl->height())
+ return;
+
+ m_impl->reshape(width, height);
+
+#if PLATFORM(CG)
+ // Need to reallocate the client-side backing store.
+ // FIXME: make this more efficient.
+ if (m_renderOutput) {
+ delete[] m_renderOutput;
+ m_renderOutput = 0;
+ }
+ int rowBytes = width * 4;
+ m_renderOutput = new unsigned char[height * rowBytes];
+#endif // PLATFORM(CG)
+}
+
+bool GraphicsContext3DInternal::isContextLost()
+{
+ return m_impl->isContextLost();
+}
+
+// Macros to assist in delegating from GraphicsContext3DInternal to
+// WebGraphicsContext3D.
+
+#define DELEGATE_TO_IMPL(name) \
+void GraphicsContext3DInternal::name() \
+{ \
+ m_impl->name(); \
+}
+
+#define DELEGATE_TO_IMPL_R(name, rt) \
+rt GraphicsContext3DInternal::name() \
+{ \
+ return m_impl->name(); \
+}
+
+#define DELEGATE_TO_IMPL_1(name, t1) \
+void GraphicsContext3DInternal::name(t1 a1) \
+{ \
+ m_impl->name(a1); \
+}
+
+#define DELEGATE_TO_IMPL_1R(name, t1, rt) \
+rt GraphicsContext3DInternal::name(t1 a1) \
+{ \
+ return m_impl->name(a1); \
+}
+
+#define DELEGATE_TO_IMPL_2(name, t1, t2) \
+void GraphicsContext3DInternal::name(t1 a1, t2 a2) \
+{ \
+ m_impl->name(a1, a2); \
+}
+
+#define DELEGATE_TO_IMPL_2R(name, t1, t2, rt) \
+rt GraphicsContext3DInternal::name(t1 a1, t2 a2) \
+{ \
+ return m_impl->name(a1, a2); \
+}
+
+#define DELEGATE_TO_IMPL_3(name, t1, t2, t3) \
+void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3) \
+{ \
+ m_impl->name(a1, a2, a3); \
+}
+
+#define DELEGATE_TO_IMPL_3R(name, t1, t2, t3, rt) \
+rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3) \
+{ \
+ return m_impl->name(a1, a2, a3); \
+}
+
+#define DELEGATE_TO_IMPL_4(name, t1, t2, t3, t4) \
+void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4) \
+{ \
+ m_impl->name(a1, a2, a3, a4); \
+}
+
+#define DELEGATE_TO_IMPL_4R(name, t1, t2, t3, t4, rt) \
+rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4) \
+{ \
+ return m_impl->name(a1, a2, a3, a4); \
+}
+
+#define DELEGATE_TO_IMPL_5(name, t1, t2, t3, t4, t5) \
+void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \
+{ \
+ m_impl->name(a1, a2, a3, a4, a5); \
+}
+
+#define DELEGATE_TO_IMPL_5R(name, t1, t2, t3, t4, t5, rt) \
+rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \
+{ \
+ return m_impl->name(a1, a2, a3, a4, a5); \
+}
+
+#define DELEGATE_TO_IMPL_6(name, t1, t2, t3, t4, t5, t6) \
+void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \
+{ \
+ m_impl->name(a1, a2, a3, a4, a5, a6); \
+}
+
+#define DELEGATE_TO_IMPL_6R(name, t1, t2, t3, t4, t5, t6, rt) \
+rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \
+{ \
+ return m_impl->name(a1, a2, a3, a4, a5, a6); \
+}
+
+#define DELEGATE_TO_IMPL_7(name, t1, t2, t3, t4, t5, t6, t7) \
+void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
+{ \
+ m_impl->name(a1, a2, a3, a4, a5, a6, a7); \
+}
+
+#define DELEGATE_TO_IMPL_7R(name, t1, t2, t3, t4, t5, t6, t7, rt) \
+rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
+{ \
+ return m_impl->name(a1, a2, a3, a4, a5, a6, a7); \
+}
+
+#define DELEGATE_TO_IMPL_8(name, t1, t2, t3, t4, t5, t6, t7, t8) \
+void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) \
+{ \
+ m_impl->name(a1, a2, a3, a4, a5, a6, a7, a8); \
+}
+
+#define DELEGATE_TO_IMPL_9R(name, t1, t2, t3, t4, t5, t6, t7, t8, t9, rt) \
+rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8, t9 a9) \
+{ \
+ return m_impl->name(a1, a2, a3, a4, a5, a6, a7, a8, a9); \
+}
+
+DELEGATE_TO_IMPL_R(makeContextCurrent, bool)
+DELEGATE_TO_IMPL_1R(sizeInBytes, int, int)
+
+bool GraphicsContext3DInternal::isGLES2Compliant() const
+{
+ return m_impl->isGLES2Compliant();
+}
+
+DELEGATE_TO_IMPL_1(activeTexture, unsigned long)
+DELEGATE_TO_IMPL_2(attachShader, Platform3DObject, Platform3DObject)
+
+void GraphicsContext3DInternal::bindAttribLocation(Platform3DObject program, unsigned long index, const String& name)
+{
+ m_impl->bindAttribLocation(program, index, name.utf8().data());
+}
+
+DELEGATE_TO_IMPL_2(bindBuffer, unsigned long, Platform3DObject)
+DELEGATE_TO_IMPL_2(bindFramebuffer, unsigned long, Platform3DObject)
+DELEGATE_TO_IMPL_2(bindRenderbuffer, unsigned long, Platform3DObject)
+DELEGATE_TO_IMPL_2(bindTexture, unsigned long, Platform3DObject)
+DELEGATE_TO_IMPL_4(blendColor, double, double, double, double)
+DELEGATE_TO_IMPL_1(blendEquation, unsigned long)
+DELEGATE_TO_IMPL_2(blendEquationSeparate, unsigned long, unsigned long)
+DELEGATE_TO_IMPL_2(blendFunc, unsigned long, unsigned long)
+DELEGATE_TO_IMPL_4(blendFuncSeparate, unsigned long, unsigned long, unsigned long, unsigned long)
+
+void GraphicsContext3DInternal::bufferData(unsigned long target, int size, unsigned long usage)
+{
+ m_impl->bufferData(target, size, 0, usage);
+}
+
+void GraphicsContext3DInternal::bufferData(unsigned long target, int size, const void* data, unsigned long usage)
+{
+ m_impl->bufferData(target, size, data, usage);
+}
+
+void GraphicsContext3DInternal::bufferSubData(unsigned long target, long offset, int size, const void* data)
+{
+ m_impl->bufferSubData(target, offset, size, data);
+}
+
+DELEGATE_TO_IMPL_1R(checkFramebufferStatus, unsigned long, unsigned long)
+DELEGATE_TO_IMPL_1(clear, unsigned long)
+DELEGATE_TO_IMPL_4(clearColor, double, double, double, double)
+DELEGATE_TO_IMPL_1(clearDepth, double)
+DELEGATE_TO_IMPL_1(clearStencil, long)
+DELEGATE_TO_IMPL_4(colorMask, bool, bool, bool, bool)
+DELEGATE_TO_IMPL_1(compileShader, Platform3DObject)
+
+DELEGATE_TO_IMPL_8(copyTexImage2D, unsigned long, long, unsigned long, long, long, unsigned long, unsigned long, long)
+DELEGATE_TO_IMPL_8(copyTexSubImage2D, unsigned long, long, long, long, long, long, unsigned long, unsigned long)
+DELEGATE_TO_IMPL_1(cullFace, unsigned long)
+DELEGATE_TO_IMPL_1(depthFunc, unsigned long)
+DELEGATE_TO_IMPL_1(depthMask, bool)
+DELEGATE_TO_IMPL_2(depthRange, double, double)
+DELEGATE_TO_IMPL_2(detachShader, Platform3DObject, Platform3DObject)
+DELEGATE_TO_IMPL_1(disable, unsigned long)
+DELEGATE_TO_IMPL_1(disableVertexAttribArray, unsigned long)
+DELEGATE_TO_IMPL_3(drawArrays, unsigned long, long, long)
+DELEGATE_TO_IMPL_4(drawElements, unsigned long, unsigned long, unsigned long, long)
+
+DELEGATE_TO_IMPL_1(enable, unsigned long)
+DELEGATE_TO_IMPL_1(enableVertexAttribArray, unsigned long)
+DELEGATE_TO_IMPL(finish)
+DELEGATE_TO_IMPL(flush)
+DELEGATE_TO_IMPL_4(framebufferRenderbuffer, unsigned long, unsigned long, unsigned long, Platform3DObject)
+DELEGATE_TO_IMPL_5(framebufferTexture2D, unsigned long, unsigned long, unsigned long, Platform3DObject, long)
+DELEGATE_TO_IMPL_1(frontFace, unsigned long)
+DELEGATE_TO_IMPL_1(generateMipmap, unsigned long)
+
+bool GraphicsContext3DInternal::getActiveAttrib(Platform3DObject program, unsigned long index, ActiveInfo& info)
+{
+ WebKit::WebGraphicsContext3D::ActiveInfo webInfo;
+ if (!m_impl->getActiveAttrib(program, index, webInfo))
+ return false;
+ info.name = webInfo.name;
+ info.type = webInfo.type;
+ info.size = webInfo.size;
+ return true;
+}
+
+bool GraphicsContext3DInternal::getActiveUniform(Platform3DObject program, unsigned long index, ActiveInfo& info)
+{
+ WebKit::WebGraphicsContext3D::ActiveInfo webInfo;
+ if (!m_impl->getActiveUniform(program, index, webInfo))
+ return false;
+ info.name = webInfo.name;
+ info.type = webInfo.type;
+ info.size = webInfo.size;
+ return true;
+}
+
+DELEGATE_TO_IMPL_4(getAttachedShaders, Platform3DObject, int, int*, unsigned int*)
+
+int GraphicsContext3DInternal::getAttribLocation(Platform3DObject program, const String& name)
+{
+ return m_impl->getAttribLocation(program, name.utf8().data());
+}
+
+DELEGATE_TO_IMPL_2(getBooleanv, unsigned long, unsigned char*)
+
+DELEGATE_TO_IMPL_3(getBufferParameteriv, unsigned long, unsigned long, int*)
+
+GraphicsContext3D::Attributes GraphicsContext3DInternal::getContextAttributes()
+{
+ WebKit::WebGraphicsContext3D::Attributes webAttributes = m_impl->getContextAttributes();
+ GraphicsContext3D::Attributes attributes;
+ attributes.alpha = webAttributes.alpha;
+ attributes.depth = webAttributes.depth;
+ attributes.stencil = webAttributes.stencil;
+ attributes.antialias = webAttributes.antialias;
+ attributes.premultipliedAlpha = webAttributes.premultipliedAlpha;
+ return attributes;
+}
+
+DELEGATE_TO_IMPL_R(getError, unsigned long)
+
+DELEGATE_TO_IMPL_2(getFloatv, unsigned long, float*)
+
+DELEGATE_TO_IMPL_4(getFramebufferAttachmentParameteriv, unsigned long, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_IMPL_2(getIntegerv, unsigned long, int*)
+
+DELEGATE_TO_IMPL_3(getProgramiv, Platform3DObject, unsigned long, int*)
+
+String GraphicsContext3DInternal::getProgramInfoLog(Platform3DObject program)
+{
+ return m_impl->getProgramInfoLog(program);
+}
+
+DELEGATE_TO_IMPL_3(getRenderbufferParameteriv, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_IMPL_3(getShaderiv, Platform3DObject, unsigned long, int*)
+
+String GraphicsContext3DInternal::getShaderInfoLog(Platform3DObject shader)
+{
+ return m_impl->getShaderInfoLog(shader);
+}
+
+String GraphicsContext3DInternal::getShaderSource(Platform3DObject shader)
+{
+ return m_impl->getShaderSource(shader);
+}
+
+String GraphicsContext3DInternal::getString(unsigned long name)
+{
+ return m_impl->getString(name);
+}
+
+DELEGATE_TO_IMPL_3(getTexParameterfv, unsigned long, unsigned long, float*)
+DELEGATE_TO_IMPL_3(getTexParameteriv, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_IMPL_3(getUniformfv, Platform3DObject, long, float*)
+DELEGATE_TO_IMPL_3(getUniformiv, Platform3DObject, long, int*)
+
+long GraphicsContext3DInternal::getUniformLocation(Platform3DObject program, const String& name)
+{
+ return m_impl->getUniformLocation(program, name.utf8().data());
+}
+
+DELEGATE_TO_IMPL_3(getVertexAttribfv, unsigned long, unsigned long, float*)
+DELEGATE_TO_IMPL_3(getVertexAttribiv, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_IMPL_2R(getVertexAttribOffset, unsigned long, unsigned long, long)
+
+DELEGATE_TO_IMPL_2(hint, unsigned long, unsigned long)
+DELEGATE_TO_IMPL_1R(isBuffer, Platform3DObject, bool)
+DELEGATE_TO_IMPL_1R(isEnabled, unsigned long, bool)
+DELEGATE_TO_IMPL_1R(isFramebuffer, Platform3DObject, bool)
+DELEGATE_TO_IMPL_1R(isProgram, Platform3DObject, bool)
+DELEGATE_TO_IMPL_1R(isRenderbuffer, Platform3DObject, bool)
+DELEGATE_TO_IMPL_1R(isShader, Platform3DObject, bool)
+DELEGATE_TO_IMPL_1R(isTexture, Platform3DObject, bool)
+DELEGATE_TO_IMPL_1(lineWidth, double)
+DELEGATE_TO_IMPL_1(linkProgram, Platform3DObject)
+DELEGATE_TO_IMPL_2(pixelStorei, unsigned long, long)
+DELEGATE_TO_IMPL_2(polygonOffset, double, double)
+DELEGATE_TO_IMPL_7(readPixels, long, long, unsigned long, unsigned long, unsigned long, unsigned long, void*)
+DELEGATE_TO_IMPL(releaseShaderCompiler)
+DELEGATE_TO_IMPL_4(renderbufferStorage, unsigned long, unsigned long, unsigned long, unsigned long)
+DELEGATE_TO_IMPL_2(sampleCoverage, double, bool)
+DELEGATE_TO_IMPL_4(scissor, long, long, unsigned long, unsigned long)
+
+void GraphicsContext3DInternal::shaderSource(Platform3DObject shader, const String& string)
+{
+ m_impl->shaderSource(shader, string.utf8().data());
+}
+
+DELEGATE_TO_IMPL_3(stencilFunc, unsigned long, long, unsigned long)
+DELEGATE_TO_IMPL_4(stencilFuncSeparate, unsigned long, unsigned long, long, unsigned long)
+DELEGATE_TO_IMPL_1(stencilMask, unsigned long)
+DELEGATE_TO_IMPL_2(stencilMaskSeparate, unsigned long, unsigned long)
+DELEGATE_TO_IMPL_3(stencilOp, unsigned long, unsigned long, unsigned long)
+DELEGATE_TO_IMPL_4(stencilOpSeparate, unsigned long, unsigned long, unsigned long, unsigned long)
+
+int GraphicsContext3DInternal::texImage2D(unsigned target, unsigned level, unsigned internalformat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, void* pixels)
+{
+ m_impl->texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ return 0;
+}
+
+DELEGATE_TO_IMPL_3(texParameterf, unsigned, unsigned, float)
+DELEGATE_TO_IMPL_3(texParameteri, unsigned, unsigned, int)
+
+int GraphicsContext3DInternal::texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, unsigned format, unsigned type, void* pixels)
+{
+ m_impl->texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+ return 0;
+}
+
+DELEGATE_TO_IMPL_2(uniform1f, long, float)
+
+void GraphicsContext3DInternal::uniform1fv(long location, float* v, int size)
+{
+ m_impl->uniform1fv(location, size, v);
+}
+
+DELEGATE_TO_IMPL_2(uniform1i, long, int)
+
+void GraphicsContext3DInternal::uniform1iv(long location, int* v, int size)
+{
+ m_impl->uniform1iv(location, size, v);
+}
+
+DELEGATE_TO_IMPL_3(uniform2f, long, float, float)
+
+void GraphicsContext3DInternal::uniform2fv(long location, float* v, int size)
+{
+ m_impl->uniform2fv(location, size, v);
+}
+
+DELEGATE_TO_IMPL_3(uniform2i, long, int, int)
+
+void GraphicsContext3DInternal::uniform2iv(long location, int* v, int size)
+{
+ m_impl->uniform2iv(location, size, v);
+}
+
+DELEGATE_TO_IMPL_4(uniform3f, long, float, float, float)
+
+void GraphicsContext3DInternal::uniform3fv(long location, float* v, int size)
+{
+ m_impl->uniform3fv(location, size, v);
+}
+
+DELEGATE_TO_IMPL_4(uniform3i, long, int, int, int)
+
+void GraphicsContext3DInternal::uniform3iv(long location, int* v, int size)
+{
+ m_impl->uniform3iv(location, size, v);
+}
+
+DELEGATE_TO_IMPL_5(uniform4f, long, float, float, float, float)
+
+void GraphicsContext3DInternal::uniform4fv(long location, float* v, int size)
+{
+ m_impl->uniform4fv(location, size, v);
+}
+
+DELEGATE_TO_IMPL_5(uniform4i, long, int, int, int, int)
+
+void GraphicsContext3DInternal::uniform4iv(long location, int* v, int size)
+{
+ m_impl->uniform4iv(location, size, v);
+}
+
+void GraphicsContext3DInternal::uniformMatrix2fv(long location, bool transpose, float* value, int size)
+{
+ m_impl->uniformMatrix2fv(location, size, transpose, value);
+}
+
+void GraphicsContext3DInternal::uniformMatrix3fv(long location, bool transpose, float* value, int size)
+{
+ m_impl->uniformMatrix3fv(location, size, transpose, value);
+}
+
+void GraphicsContext3DInternal::uniformMatrix4fv(long location, bool transpose, float* value, int size)
+{
+ m_impl->uniformMatrix4fv(location, size, transpose, value);
+}
+
+DELEGATE_TO_IMPL_1(useProgram, Platform3DObject)
+DELEGATE_TO_IMPL_1(validateProgram, Platform3DObject)
+
+DELEGATE_TO_IMPL_2(vertexAttrib1f, unsigned long, float)
+DELEGATE_TO_IMPL_2(vertexAttrib1fv, unsigned long, float*)
+DELEGATE_TO_IMPL_3(vertexAttrib2f, unsigned long, float, float)
+DELEGATE_TO_IMPL_2(vertexAttrib2fv, unsigned long, float*)
+DELEGATE_TO_IMPL_4(vertexAttrib3f, unsigned long, float, float, float)
+DELEGATE_TO_IMPL_2(vertexAttrib3fv, unsigned long, float*)
+DELEGATE_TO_IMPL_5(vertexAttrib4f, unsigned long, float, float, float, float)
+DELEGATE_TO_IMPL_2(vertexAttrib4fv, unsigned long, float*)
+DELEGATE_TO_IMPL_6(vertexAttribPointer, unsigned long, int, int, bool, unsigned long, unsigned long)
+
+DELEGATE_TO_IMPL_4(viewport, long, long, unsigned long, unsigned long)
+
+DELEGATE_TO_IMPL_R(createBuffer, unsigned)
+DELEGATE_TO_IMPL_R(createFramebuffer, unsigned)
+DELEGATE_TO_IMPL_R(createProgram, unsigned)
+DELEGATE_TO_IMPL_R(createRenderbuffer, unsigned)
+DELEGATE_TO_IMPL_1R(createShader, unsigned long, unsigned)
+DELEGATE_TO_IMPL_R(createTexture, unsigned)
+
+DELEGATE_TO_IMPL_1(deleteBuffer, unsigned)
+DELEGATE_TO_IMPL_1(deleteFramebuffer, unsigned)
+DELEGATE_TO_IMPL_1(deleteProgram, unsigned)
+DELEGATE_TO_IMPL_1(deleteRenderbuffer, unsigned)
+DELEGATE_TO_IMPL_1(deleteShader, unsigned)
+DELEGATE_TO_IMPL_1(deleteTexture, unsigned)
+
+DELEGATE_TO_IMPL_1(synthesizeGLError, unsigned long)
+
+Extensions3D* GraphicsContext3DInternal::getExtensions()
+{
+ if (!m_extensions)
+ m_extensions = adoptPtr(new Extensions3DChromium(this));
+ return m_extensions.get();
+}
+
+bool GraphicsContext3DInternal::supportsExtension(const String& name)
+{
+ if (!m_initializedAvailableExtensions) {
+ String extensionsString = getString(GraphicsContext3D::EXTENSIONS);
+ Vector<String> availableExtensions;
+ extensionsString.split(" ", availableExtensions);
+ for (size_t i = 0; i < availableExtensions.size(); ++i)
+ m_availableExtensions.add(availableExtensions[i]);
+ m_initializedAvailableExtensions = true;
+ }
+ return m_availableExtensions.contains(name);
+}
+
+DELEGATE_TO_IMPL_4R(mapBufferSubDataCHROMIUM, unsigned, int, int, unsigned, void*)
+DELEGATE_TO_IMPL_1(unmapBufferSubDataCHROMIUM, const void*)
+DELEGATE_TO_IMPL_9R(mapTexSubImage2DCHROMIUM, unsigned, int, int, int, int, int, unsigned, unsigned, unsigned, void*)
+DELEGATE_TO_IMPL_1(unmapTexSubImage2DCHROMIUM, const void*)
+DELEGATE_TO_IMPL_2(copyTextureToParentTextureCHROMIUM, unsigned, unsigned)
+
+//----------------------------------------------------------------------
+// GraphicsContext3D
+//
+
+// Macros to assist in delegating from GraphicsContext3D to
+// GraphicsContext3DInternal.
+
+#define DELEGATE_TO_INTERNAL(name) \
+void GraphicsContext3D::name() \
+{ \
+ m_internal->name(); \
+}
+
+#define DELEGATE_TO_INTERNAL_R(name, rt) \
+rt GraphicsContext3D::name() \
+{ \
+ return m_internal->name(); \
+}
+
+#define DELEGATE_TO_INTERNAL_1(name, t1) \
+void GraphicsContext3D::name(t1 a1) \
+{ \
+ m_internal->name(a1); \
+}
+
+#define DELEGATE_TO_INTERNAL_1R(name, t1, rt) \
+rt GraphicsContext3D::name(t1 a1) \
+{ \
+ return m_internal->name(a1); \
+}
+
+#define DELEGATE_TO_INTERNAL_2(name, t1, t2) \
+void GraphicsContext3D::name(t1 a1, t2 a2) \
+{ \
+ m_internal->name(a1, a2); \
+}
+
+#define DELEGATE_TO_INTERNAL_2R(name, t1, t2, rt) \
+rt GraphicsContext3D::name(t1 a1, t2 a2) \
+{ \
+ return m_internal->name(a1, a2); \
+}
+
+#define DELEGATE_TO_INTERNAL_3(name, t1, t2, t3) \
+void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \
+{ \
+ m_internal->name(a1, a2, a3); \
+}
+
+#define DELEGATE_TO_INTERNAL_3R(name, t1, t2, t3, rt) \
+rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \
+{ \
+ return m_internal->name(a1, a2, a3); \
+}
+
+#define DELEGATE_TO_INTERNAL_4(name, t1, t2, t3, t4) \
+void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \
+{ \
+ m_internal->name(a1, a2, a3, a4); \
+}
+
+#define DELEGATE_TO_INTERNAL_4R(name, t1, t2, t3, t4, rt) \
+rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \
+{ \
+ return m_internal->name(a1, a2, a3, a4); \
+}
+
+#define DELEGATE_TO_INTERNAL_5(name, t1, t2, t3, t4, t5) \
+void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \
+{ \
+ m_internal->name(a1, a2, a3, a4, a5); \
+}
+
+#define DELEGATE_TO_INTERNAL_6(name, t1, t2, t3, t4, t5, t6) \
+void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \
+{ \
+ m_internal->name(a1, a2, a3, a4, a5, a6); \
+}
+
+#define DELEGATE_TO_INTERNAL_6R(name, t1, t2, t3, t4, t5, t6, rt) \
+rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \
+{ \
+ return m_internal->name(a1, a2, a3, a4, a5, a6); \
+}
+
+#define DELEGATE_TO_INTERNAL_7(name, t1, t2, t3, t4, t5, t6, t7) \
+void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
+{ \
+ m_internal->name(a1, a2, a3, a4, a5, a6, a7); \
+}
+
+#define DELEGATE_TO_INTERNAL_7R(name, t1, t2, t3, t4, t5, t6, t7, rt) \
+rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
+{ \
+ return m_internal->name(a1, a2, a3, a4, a5, a6, a7); \
+}
+
+#define DELEGATE_TO_INTERNAL_8(name, t1, t2, t3, t4, t5, t6, t7, t8) \
+void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) \
+{ \
+ m_internal->name(a1, a2, a3, a4, a5, a6, a7, a8); \
+}
+
+#define DELEGATE_TO_INTERNAL_9R(name, t1, t2, t3, t4, t5, t6, t7, t8, t9, rt) \
+rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8, t9 a9) \
+{ \
+ return m_internal->name(a1, a2, a3, a4, a5, a6, a7, a8, a9); \
+}
+
+GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes, HostWindow*, bool)
+{
+}
+
+GraphicsContext3D::~GraphicsContext3D()
+{
+}
+
+PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle)
+{
+ OwnPtr<GraphicsContext3DInternal> internal = adoptPtr(new GraphicsContext3DInternal());
+ if (!internal->initialize(attrs, hostWindow, renderStyle == RenderDirectlyToHostWindow)) {
+ return 0;
+ }
+ RefPtr<GraphicsContext3D> result = adoptRef(new GraphicsContext3D(attrs, hostWindow, renderStyle == RenderDirectlyToHostWindow));
+ result->m_internal = internal.release();
+ return result.release();
+}
+
+PlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D() const
+{
+ return m_internal->platformGraphicsContext3D();
+}
+
+Platform3DObject GraphicsContext3D::platformTexture() const
+{
+ return m_internal->platformTexture();
+}
+
+void GraphicsContext3D::prepareTexture()
+{
+ return m_internal->prepareTexture();
+}
+
+#if USE(ACCELERATED_COMPOSITING)
+PlatformLayer* GraphicsContext3D::platformLayer() const
+{
+ WebGLLayerChromium* canvasLayer = m_internal->platformLayer();
+ canvasLayer->setContext(this);
+ return canvasLayer;
+}
+#endif
+
+DELEGATE_TO_INTERNAL(makeContextCurrent)
+DELEGATE_TO_INTERNAL_1R(sizeInBytes, int, int)
+DELEGATE_TO_INTERNAL_2(reshape, int, int)
+
+DELEGATE_TO_INTERNAL_1(activeTexture, unsigned long)
+DELEGATE_TO_INTERNAL_2(attachShader, Platform3DObject, Platform3DObject)
+DELEGATE_TO_INTERNAL_3(bindAttribLocation, Platform3DObject, unsigned long, const String&)
+
+DELEGATE_TO_INTERNAL_2(bindBuffer, unsigned long, Platform3DObject)
+DELEGATE_TO_INTERNAL_2(bindFramebuffer, unsigned long, Platform3DObject)
+DELEGATE_TO_INTERNAL_2(bindRenderbuffer, unsigned long, Platform3DObject)
+DELEGATE_TO_INTERNAL_2(bindTexture, unsigned long, Platform3DObject)
+DELEGATE_TO_INTERNAL_4(blendColor, double, double, double, double)
+DELEGATE_TO_INTERNAL_1(blendEquation, unsigned long)
+DELEGATE_TO_INTERNAL_2(blendEquationSeparate, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_2(blendFunc, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_4(blendFuncSeparate, unsigned long, unsigned long, unsigned long, unsigned long)
+
+DELEGATE_TO_INTERNAL_3(bufferData, unsigned long, int, unsigned long)
+DELEGATE_TO_INTERNAL_4(bufferData, unsigned long, int, const void*, unsigned long)
+DELEGATE_TO_INTERNAL_4(bufferSubData, unsigned long, long, int, const void*)
+
+DELEGATE_TO_INTERNAL_1R(checkFramebufferStatus, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_1(clear, unsigned long)
+DELEGATE_TO_INTERNAL_4(clearColor, double, double, double, double)
+DELEGATE_TO_INTERNAL_1(clearDepth, double)
+DELEGATE_TO_INTERNAL_1(clearStencil, long)
+DELEGATE_TO_INTERNAL_4(colorMask, bool, bool, bool, bool)
+DELEGATE_TO_INTERNAL_1(compileShader, Platform3DObject)
+
+DELEGATE_TO_INTERNAL_8(copyTexImage2D, unsigned long, long, unsigned long, long, long, unsigned long, unsigned long, long)
+DELEGATE_TO_INTERNAL_8(copyTexSubImage2D, unsigned long, long, long, long, long, long, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_1(cullFace, unsigned long)
+DELEGATE_TO_INTERNAL_1(depthFunc, unsigned long)
+DELEGATE_TO_INTERNAL_1(depthMask, bool)
+DELEGATE_TO_INTERNAL_2(depthRange, double, double)
+DELEGATE_TO_INTERNAL_2(detachShader, Platform3DObject, Platform3DObject)
+DELEGATE_TO_INTERNAL_1(disable, unsigned long)
+DELEGATE_TO_INTERNAL_1(disableVertexAttribArray, unsigned long)
+DELEGATE_TO_INTERNAL_3(drawArrays, unsigned long, long, long)
+DELEGATE_TO_INTERNAL_4(drawElements, unsigned long, unsigned long, unsigned long, long)
+
+DELEGATE_TO_INTERNAL_1(enable, unsigned long)
+DELEGATE_TO_INTERNAL_1(enableVertexAttribArray, unsigned long)
+DELEGATE_TO_INTERNAL(finish)
+DELEGATE_TO_INTERNAL(flush)
+DELEGATE_TO_INTERNAL_4(framebufferRenderbuffer, unsigned long, unsigned long, unsigned long, Platform3DObject)
+DELEGATE_TO_INTERNAL_5(framebufferTexture2D, unsigned long, unsigned long, unsigned long, Platform3DObject, long)
+DELEGATE_TO_INTERNAL_1(frontFace, unsigned long)
+DELEGATE_TO_INTERNAL_1(generateMipmap, unsigned long)
+
+DELEGATE_TO_INTERNAL_3R(getActiveAttrib, Platform3DObject, unsigned long, ActiveInfo&, bool)
+DELEGATE_TO_INTERNAL_3R(getActiveUniform, Platform3DObject, unsigned long, ActiveInfo&, bool)
+
+DELEGATE_TO_INTERNAL_4(getAttachedShaders, Platform3DObject, int, int*, unsigned int*)
+
+DELEGATE_TO_INTERNAL_2R(getAttribLocation, Platform3DObject, const String&, int)
+
+DELEGATE_TO_INTERNAL_2(getBooleanv, unsigned long, unsigned char*)
+
+DELEGATE_TO_INTERNAL_3(getBufferParameteriv, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_INTERNAL_R(getContextAttributes, GraphicsContext3D::Attributes)
+
+DELEGATE_TO_INTERNAL_R(getError, unsigned long)
+
+DELEGATE_TO_INTERNAL_2(getFloatv, unsigned long, float*)
+
+DELEGATE_TO_INTERNAL_4(getFramebufferAttachmentParameteriv, unsigned long, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_INTERNAL_2(getIntegerv, unsigned long, int*)
+
+DELEGATE_TO_INTERNAL_3(getProgramiv, Platform3DObject, unsigned long, int*)
+
+DELEGATE_TO_INTERNAL_1R(getProgramInfoLog, Platform3DObject, String)
+
+DELEGATE_TO_INTERNAL_3(getRenderbufferParameteriv, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_INTERNAL_3(getShaderiv, Platform3DObject, unsigned long, int*)
+
+DELEGATE_TO_INTERNAL_1R(getShaderInfoLog, Platform3DObject, String)
+
+DELEGATE_TO_INTERNAL_1R(getShaderSource, Platform3DObject, String)
+DELEGATE_TO_INTERNAL_1R(getString, unsigned long, String)
+
+DELEGATE_TO_INTERNAL_3(getTexParameterfv, unsigned long, unsigned long, float*)
+DELEGATE_TO_INTERNAL_3(getTexParameteriv, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_INTERNAL_3(getUniformfv, Platform3DObject, long, float*)
+DELEGATE_TO_INTERNAL_3(getUniformiv, Platform3DObject, long, int*)
+
+DELEGATE_TO_INTERNAL_2R(getUniformLocation, Platform3DObject, const String&, long)
+
+DELEGATE_TO_INTERNAL_3(getVertexAttribfv, unsigned long, unsigned long, float*)
+DELEGATE_TO_INTERNAL_3(getVertexAttribiv, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_INTERNAL_2R(getVertexAttribOffset, unsigned long, unsigned long, long)
+
+DELEGATE_TO_INTERNAL_2(hint, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_1R(isBuffer, Platform3DObject, bool)
+DELEGATE_TO_INTERNAL_1R(isEnabled, unsigned long, bool)
+DELEGATE_TO_INTERNAL_1R(isFramebuffer, Platform3DObject, bool)
+DELEGATE_TO_INTERNAL_1R(isProgram, Platform3DObject, bool)
+DELEGATE_TO_INTERNAL_1R(isRenderbuffer, Platform3DObject, bool)
+DELEGATE_TO_INTERNAL_1R(isShader, Platform3DObject, bool)
+DELEGATE_TO_INTERNAL_1R(isTexture, Platform3DObject, bool)
+DELEGATE_TO_INTERNAL_1(lineWidth, double)
+DELEGATE_TO_INTERNAL_1(linkProgram, Platform3DObject)
+DELEGATE_TO_INTERNAL_2(pixelStorei, unsigned long, long)
+DELEGATE_TO_INTERNAL_2(polygonOffset, double, double)
+
+DELEGATE_TO_INTERNAL_7(readPixels, long, long, unsigned long, unsigned long, unsigned long, unsigned long, void*)
+
+DELEGATE_TO_INTERNAL(releaseShaderCompiler)
+DELEGATE_TO_INTERNAL_4(renderbufferStorage, unsigned long, unsigned long, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_2(sampleCoverage, double, bool)
+DELEGATE_TO_INTERNAL_4(scissor, long, long, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_2(shaderSource, Platform3DObject, const String&)
+DELEGATE_TO_INTERNAL_3(stencilFunc, unsigned long, long, unsigned long)
+DELEGATE_TO_INTERNAL_4(stencilFuncSeparate, unsigned long, unsigned long, long, unsigned long)
+DELEGATE_TO_INTERNAL_1(stencilMask, unsigned long)
+DELEGATE_TO_INTERNAL_2(stencilMaskSeparate, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_3(stencilOp, unsigned long, unsigned long, unsigned long)
+DELEGATE_TO_INTERNAL_4(stencilOpSeparate, unsigned long, unsigned long, unsigned long, unsigned long)
+
+DELEGATE_TO_INTERNAL_9R(texImage2D, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, void*, int)
+DELEGATE_TO_INTERNAL_3(texParameterf, unsigned, unsigned, float)
+DELEGATE_TO_INTERNAL_3(texParameteri, unsigned, unsigned, int)
+DELEGATE_TO_INTERNAL_9R(texSubImage2D, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, void*, int)
+
+DELEGATE_TO_INTERNAL_2(uniform1f, long, float)
+DELEGATE_TO_INTERNAL_3(uniform1fv, long, float*, int)
+DELEGATE_TO_INTERNAL_2(uniform1i, long, int)
+DELEGATE_TO_INTERNAL_3(uniform1iv, long, int*, int)
+DELEGATE_TO_INTERNAL_3(uniform2f, long, float, float)
+DELEGATE_TO_INTERNAL_3(uniform2fv, long, float*, int)
+DELEGATE_TO_INTERNAL_3(uniform2i, long, int, int)
+DELEGATE_TO_INTERNAL_3(uniform2iv, long, int*, int)
+DELEGATE_TO_INTERNAL_4(uniform3f, long, float, float, float)
+DELEGATE_TO_INTERNAL_3(uniform3fv, long, float*, int)
+DELEGATE_TO_INTERNAL_4(uniform3i, long, int, int, int)
+DELEGATE_TO_INTERNAL_3(uniform3iv, long, int*, int)
+DELEGATE_TO_INTERNAL_5(uniform4f, long, float, float, float, float)
+DELEGATE_TO_INTERNAL_3(uniform4fv, long, float*, int)
+DELEGATE_TO_INTERNAL_5(uniform4i, long, int, int, int, int)
+DELEGATE_TO_INTERNAL_3(uniform4iv, long, int*, int)
+DELEGATE_TO_INTERNAL_4(uniformMatrix2fv, long, bool, float*, int)
+DELEGATE_TO_INTERNAL_4(uniformMatrix3fv, long, bool, float*, int)
+DELEGATE_TO_INTERNAL_4(uniformMatrix4fv, long, bool, float*, int)
+
+DELEGATE_TO_INTERNAL_1(useProgram, Platform3DObject)
+DELEGATE_TO_INTERNAL_1(validateProgram, Platform3DObject)
+
+DELEGATE_TO_INTERNAL_2(vertexAttrib1f, unsigned long, float)
+DELEGATE_TO_INTERNAL_2(vertexAttrib1fv, unsigned long, float*)
+DELEGATE_TO_INTERNAL_3(vertexAttrib2f, unsigned long, float, float)
+DELEGATE_TO_INTERNAL_2(vertexAttrib2fv, unsigned long, float*)
+DELEGATE_TO_INTERNAL_4(vertexAttrib3f, unsigned long, float, float, float)
+DELEGATE_TO_INTERNAL_2(vertexAttrib3fv, unsigned long, float*)
+DELEGATE_TO_INTERNAL_5(vertexAttrib4f, unsigned long, float, float, float, float)
+DELEGATE_TO_INTERNAL_2(vertexAttrib4fv, unsigned long, float*)
+DELEGATE_TO_INTERNAL_6(vertexAttribPointer, unsigned long, int, int, bool, unsigned long, unsigned long)
+
+DELEGATE_TO_INTERNAL_4(viewport, long, long, unsigned long, unsigned long)
+
+DELEGATE_TO_INTERNAL_1(paintRenderingResultsToCanvas, CanvasRenderingContext*)
+
+bool GraphicsContext3D::paintsIntoCanvasBuffer() const
+{
+ return m_internal->paintsIntoCanvasBuffer();
+}
+
+DELEGATE_TO_INTERNAL_R(createBuffer, unsigned)
+DELEGATE_TO_INTERNAL_R(createFramebuffer, unsigned)
+DELEGATE_TO_INTERNAL_R(createProgram, unsigned)
+DELEGATE_TO_INTERNAL_R(createRenderbuffer, unsigned)
+DELEGATE_TO_INTERNAL_1R(createShader, unsigned long, unsigned)
+DELEGATE_TO_INTERNAL_R(createTexture, unsigned)
+
+DELEGATE_TO_INTERNAL_1(deleteBuffer, unsigned)
+DELEGATE_TO_INTERNAL_1(deleteFramebuffer, unsigned)
+DELEGATE_TO_INTERNAL_1(deleteProgram, unsigned)
+DELEGATE_TO_INTERNAL_1(deleteRenderbuffer, unsigned)
+DELEGATE_TO_INTERNAL_1(deleteShader, unsigned)
+DELEGATE_TO_INTERNAL_1(deleteTexture, unsigned)
+
+DELEGATE_TO_INTERNAL_1(synthesizeGLError, unsigned long)
+DELEGATE_TO_INTERNAL_R(getExtensions, Extensions3D*)
+
+bool GraphicsContext3D::isGLES2Compliant() const
+{
+ return m_internal->isGLES2Compliant();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(3D_CANVAS)
diff --git a/WebKit/chromium/src/GraphicsContext3DInternal.h b/WebKit/chromium/src/GraphicsContext3DInternal.h
new file mode 100644
index 0000000..220cbb8
--- /dev/null
+++ b/WebKit/chromium/src/GraphicsContext3DInternal.h
@@ -0,0 +1,308 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef GraphicsContext3DInternal_h
+#define GraphicsContext3DInternal_h
+
+#include "GraphicsContext3D.h"
+#include <wtf/HashSet.h>
+#include <wtf/OwnPtr.h>
+#if PLATFORM(SKIA)
+#include "SkBitmap.h"
+#endif
+
+namespace WebKit {
+class WebGraphicsContext3D;
+class WebViewImpl;
+} // namespace WebKit
+
+namespace WebCore {
+
+class Extensions3DChromium;
+#if USE(ACCELERATED_COMPOSITING)
+class WebGLLayerChromium;
+#endif
+
+class GraphicsContext3DInternal {
+public:
+ GraphicsContext3DInternal();
+ ~GraphicsContext3DInternal();
+
+ bool initialize(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool renderDirectlyToHostWindow);
+
+ // Helper function to provide access to the lower-level WebGraphicsContext3D,
+ // which is needed for subordinate contexts like WebGL's to share resources
+ // with the compositor's context.
+ static WebKit::WebGraphicsContext3D* extractWebGraphicsContext3D(GraphicsContext3D* context);
+
+ PlatformGraphicsContext3D platformGraphicsContext3D() const;
+ Platform3DObject platformTexture() const;
+
+ bool makeContextCurrent();
+
+ int sizeInBytes(int type);
+
+ void reshape(int width, int height);
+
+ void paintRenderingResultsToCanvas(CanvasRenderingContext*);
+ bool paintsIntoCanvasBuffer() const;
+
+ void prepareTexture();
+
+#if USE(ACCELERATED_COMPOSITING)
+ WebGLLayerChromium* platformLayer() const;
+#endif
+ bool isGLES2Compliant() const;
+
+ //----------------------------------------------------------------------
+ // Entry points for WebGL.
+ //
+ void activeTexture(unsigned long texture);
+ void attachShader(Platform3DObject program, Platform3DObject shader);
+ void bindAttribLocation(Platform3DObject, unsigned long index, const String& name);
+ void bindBuffer(unsigned long target, Platform3DObject);
+ void bindFramebuffer(unsigned long target, Platform3DObject);
+ void bindRenderbuffer(unsigned long target, Platform3DObject);
+ void bindTexture(unsigned long target, Platform3DObject texture);
+ void blendColor(double red, double green, double blue, double alpha);
+ void blendEquation(unsigned long mode);
+ void blendEquationSeparate(unsigned long modeRGB, unsigned long modeAlpha);
+ void blendFunc(unsigned long sfactor, unsigned long dfactor);
+ void blendFuncSeparate(unsigned long srcRGB, unsigned long dstRGB, unsigned long srcAlpha, unsigned long dstAlpha);
+
+ void bufferData(unsigned long target, int size, unsigned long usage);
+ void bufferData(unsigned long target, int size, const void* data, unsigned long usage);
+ void bufferSubData(unsigned long target, long offset, int size, const void* data);
+
+ unsigned long checkFramebufferStatus(unsigned long target);
+ void clear(unsigned long mask);
+ void clearColor(double red, double green, double blue, double alpha);
+ void clearDepth(double depth);
+ void clearStencil(long s);
+ void colorMask(bool red, bool green, bool blue, bool alpha);
+ void compileShader(Platform3DObject);
+
+ void copyTexImage2D(unsigned long target, long level, unsigned long internalformat, long x, long y, unsigned long width, unsigned long height, long border);
+ void copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, long x, long y, unsigned long width, unsigned long height);
+ void cullFace(unsigned long mode);
+ void depthFunc(unsigned long func);
+ void depthMask(bool flag);
+ void depthRange(double zNear, double zFar);
+ void detachShader(Platform3DObject, Platform3DObject);
+ void disable(unsigned long cap);
+ void disableVertexAttribArray(unsigned long index);
+ void drawArrays(unsigned long mode, long first, long count);
+ void drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset);
+
+ void enable(unsigned long cap);
+ void enableVertexAttribArray(unsigned long index);
+ void finish();
+ void flush();
+ void framebufferRenderbuffer(unsigned long target, unsigned long attachment, unsigned long renderbuffertarget, Platform3DObject);
+ void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, Platform3DObject, long level);
+ void frontFace(unsigned long mode);
+ void generateMipmap(unsigned long target);
+
+ bool getActiveAttrib(Platform3DObject program, unsigned long index, ActiveInfo&);
+ bool getActiveUniform(Platform3DObject program, unsigned long index, ActiveInfo&);
+
+ void getAttachedShaders(Platform3DObject program, int maxCount, int* count, unsigned int* shaders);
+
+ int getAttribLocation(Platform3DObject, const String& name);
+
+ void getBooleanv(unsigned long pname, unsigned char* value);
+
+ void getBufferParameteriv(unsigned long target, unsigned long pname, int* value);
+
+ GraphicsContext3D::Attributes getContextAttributes();
+
+ unsigned long getError();
+
+ bool isContextLost();
+
+ void getFloatv(unsigned long pname, float* value);
+
+ void getFramebufferAttachmentParameteriv(unsigned long target, unsigned long attachment, unsigned long pname, int* value);
+
+ void getIntegerv(unsigned long pname, int* value);
+
+ void getProgramiv(Platform3DObject program, unsigned long pname, int* value);
+
+ String getProgramInfoLog(Platform3DObject);
+
+ void getRenderbufferParameteriv(unsigned long target, unsigned long pname, int* value);
+
+ void getShaderiv(Platform3DObject, unsigned long pname, int* value);
+
+ String getShaderInfoLog(Platform3DObject);
+
+ String getShaderSource(Platform3DObject);
+ String getString(unsigned long name);
+
+ void getTexParameterfv(unsigned long target, unsigned long pname, float* value);
+ void getTexParameteriv(unsigned long target, unsigned long pname, int* value);
+
+ void getUniformfv(Platform3DObject program, long location, float* value);
+ void getUniformiv(Platform3DObject program, long location, int* value);
+
+ long getUniformLocation(Platform3DObject, const String& name);
+
+ void getVertexAttribfv(unsigned long index, unsigned long pname, float* value);
+ void getVertexAttribiv(unsigned long index, unsigned long pname, int* value);
+
+ long getVertexAttribOffset(unsigned long index, unsigned long pname);
+
+ void hint(unsigned long target, unsigned long mode);
+ bool isBuffer(Platform3DObject);
+ bool isEnabled(unsigned long cap);
+ bool isFramebuffer(Platform3DObject);
+ bool isProgram(Platform3DObject);
+ bool isRenderbuffer(Platform3DObject);
+ bool isShader(Platform3DObject);
+ bool isTexture(Platform3DObject);
+ void lineWidth(double);
+ void linkProgram(Platform3DObject);
+ void pixelStorei(unsigned long pname, long param);
+ void polygonOffset(double factor, double units);
+
+ void readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* data);
+
+ void releaseShaderCompiler();
+ void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height);
+ void sampleCoverage(double value, bool invert);
+ void scissor(long x, long y, unsigned long width, unsigned long height);
+ void shaderSource(Platform3DObject, const String& string);
+ void stencilFunc(unsigned long func, long ref, unsigned long mask);
+ void stencilFuncSeparate(unsigned long face, unsigned long func, long ref, unsigned long mask);
+ void stencilMask(unsigned long mask);
+ void stencilMaskSeparate(unsigned long face, unsigned long mask);
+ void stencilOp(unsigned long fail, unsigned long zfail, unsigned long zpass);
+ void stencilOpSeparate(unsigned long face, unsigned long fail, unsigned long zfail, unsigned long zpass);
+
+ // These next several functions return an error code (0 if no errors) rather than using an ExceptionCode.
+ // Currently they return -1 on any error.
+ int texImage2D(unsigned target, unsigned level, unsigned internalformat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, void* pixels);
+
+ void texParameterf(unsigned target, unsigned pname, float param);
+ void texParameteri(unsigned target, unsigned pname, int param);
+
+ int texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, unsigned format, unsigned type, void* pixels);
+
+ void uniform1f(long location, float x);
+ void uniform1fv(long location, float* v, int size);
+ void uniform1i(long location, int x);
+ void uniform1iv(long location, int* v, int size);
+ void uniform2f(long location, float x, float y);
+ void uniform2fv(long location, float* v, int size);
+ void uniform2i(long location, int x, int y);
+ void uniform2iv(long location, int* v, int size);
+ void uniform3f(long location, float x, float y, float z);
+ void uniform3fv(long location, float* v, int size);
+ void uniform3i(long location, int x, int y, int z);
+ void uniform3iv(long location, int* v, int size);
+ void uniform4f(long location, float x, float y, float z, float w);
+ void uniform4fv(long location, float* v, int size);
+ void uniform4i(long location, int x, int y, int z, int w);
+ void uniform4iv(long location, int* v, int size);
+ void uniformMatrix2fv(long location, bool transpose, float* value, int size);
+ void uniformMatrix3fv(long location, bool transpose, float* value, int size);
+ void uniformMatrix4fv(long location, bool transpose, float* value, int size);
+
+ void useProgram(Platform3DObject);
+ void validateProgram(Platform3DObject);
+
+ void vertexAttrib1f(unsigned long indx, float x);
+ void vertexAttrib1fv(unsigned long indx, float* values);
+ void vertexAttrib2f(unsigned long indx, float x, float y);
+ void vertexAttrib2fv(unsigned long indx, float* values);
+ void vertexAttrib3f(unsigned long indx, float x, float y, float z);
+ void vertexAttrib3fv(unsigned long indx, float* values);
+ void vertexAttrib4f(unsigned long indx, float x, float y, float z, float w);
+ void vertexAttrib4fv(unsigned long indx, float* values);
+ void vertexAttribPointer(unsigned long indx, int size, int type, bool normalized,
+ unsigned long stride, unsigned long offset);
+
+ void viewport(long x, long y, unsigned long width, unsigned long height);
+
+ unsigned createBuffer();
+ unsigned createFramebuffer();
+ unsigned createProgram();
+ unsigned createRenderbuffer();
+ unsigned createShader(unsigned long);
+ unsigned createTexture();
+
+ void deleteBuffer(unsigned);
+ void deleteFramebuffer(unsigned);
+ void deleteProgram(unsigned);
+ void deleteRenderbuffer(unsigned);
+ void deleteShader(unsigned);
+ void deleteTexture(unsigned);
+
+ void synthesizeGLError(unsigned long error);
+
+ // Extensions3D support.
+ Extensions3D* getExtensions();
+ bool supportsExtension(const String& name);
+
+ // EXT_texture_format_BGRA8888
+ bool supportsBGRA();
+
+ // GL_CHROMIUM_map_sub
+ bool supportsMapSubCHROMIUM();
+ void* mapBufferSubDataCHROMIUM(unsigned target, int offset, int size, unsigned access);
+ void unmapBufferSubDataCHROMIUM(const void*);
+ void* mapTexSubImage2DCHROMIUM(unsigned target, int level, int xoffset, int yoffset, int width, int height, unsigned format, unsigned type, unsigned access);
+ void unmapTexSubImage2DCHROMIUM(const void*);
+
+ // GL_CHROMIUM_copy_texture_to_parent_texture
+ bool supportsCopyTextureToParentTextureCHROMIUM();
+ void copyTextureToParentTextureCHROMIUM(unsigned texture, unsigned parentTexture);
+
+private:
+ OwnPtr<WebKit::WebGraphicsContext3D> m_impl;
+ OwnPtr<Extensions3DChromium> m_extensions;
+ WebKit::WebViewImpl* m_webViewImpl;
+ bool m_initializedAvailableExtensions;
+ HashSet<String> m_availableExtensions;
+#if USE(ACCELERATED_COMPOSITING)
+ RefPtr<WebGLLayerChromium> m_compositingLayer;
+#endif
+#if PLATFORM(SKIA)
+ // If the width and height of the Canvas's backing store don't
+ // match those that we were given in the most recent call to
+ // reshape(), then we need an intermediate bitmap to read back the
+ // frame buffer into. This seems to happen when CSS styles are
+ // used to resize the Canvas.
+ SkBitmap m_resizingBitmap;
+#endif
+
+#if PLATFORM(CG)
+ unsigned char* m_renderOutput;
+#endif
+};
+
+} // namespace WebCore
+
+#endif // GraphicsContext3D_h
diff --git a/WebKit/chromium/src/IDBCallbacksProxy.cpp b/WebKit/chromium/src/IDBCallbacksProxy.cpp
new file mode 100644
index 0000000..69051d0
--- /dev/null
+++ b/WebKit/chromium/src/IDBCallbacksProxy.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2010 Google 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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.
+ */
+
+#include "config.h"
+#include "IDBCallbacksProxy.h"
+
+#include "IDBDatabaseError.h"
+#include "IDBDatabaseProxy.h"
+#include "WebIDBCallbacks.h"
+#include "WebIDBCursorImpl.h"
+#include "WebIDBDatabaseImpl.h"
+#include "WebIDBDatabaseError.h"
+#include "WebIDBIndexImpl.h"
+#include "WebIDBKey.h"
+#include "WebIDBObjectStoreImpl.h"
+#include "WebIDBTransactionImpl.h"
+#include "WebSerializedScriptValue.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+PassRefPtr<IDBCallbacksProxy> IDBCallbacksProxy::create(PassOwnPtr<WebKit::WebIDBCallbacks> callbacks)
+{
+ return adoptRef(new IDBCallbacksProxy(callbacks));
+}
+
+IDBCallbacksProxy::IDBCallbacksProxy(PassOwnPtr<WebKit::WebIDBCallbacks> callbacks)
+ : m_callbacks(callbacks)
+{
+}
+
+IDBCallbacksProxy::~IDBCallbacksProxy()
+{
+}
+
+void IDBCallbacksProxy::onError(PassRefPtr<IDBDatabaseError> idbDatabaseError)
+{
+ m_callbacks->onError(WebKit::WebIDBDatabaseError(idbDatabaseError));
+ m_callbacks.clear();
+}
+
+void IDBCallbacksProxy::onSuccess()
+{
+ m_callbacks->onSuccess();
+ m_callbacks.clear();
+}
+
+void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBCursorBackendInterface> idbCursorBackend)
+{
+ m_callbacks->onSuccess(new WebKit::WebIDBCursorImpl(idbCursorBackend));
+ m_callbacks.clear();
+}
+
+void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBDatabaseBackendInterface> backend)
+{
+ m_callbacks->onSuccess(new WebKit::WebIDBDatabaseImpl(backend));
+ m_callbacks.clear();
+}
+
+void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBIndexBackendInterface> backend)
+{
+ m_callbacks->onSuccess(new WebKit::WebIDBIndexImpl(backend));
+ m_callbacks.clear();
+}
+
+void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBKey> idbKey)
+{
+ m_callbacks->onSuccess(WebKit::WebIDBKey(idbKey));
+ m_callbacks.clear();
+}
+
+void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBObjectStoreBackendInterface> backend)
+{
+ m_callbacks->onSuccess(new WebKit::WebIDBObjectStoreImpl(backend));
+ m_callbacks.clear();
+}
+
+void IDBCallbacksProxy::onSuccess(PassRefPtr<IDBTransactionBackendInterface> backend)
+{
+ m_callbacks->onSuccess(new WebKit::WebIDBTransactionImpl(backend));
+ m_callbacks.clear();
+}
+
+void IDBCallbacksProxy::onSuccess(PassRefPtr<SerializedScriptValue> serializedScriptValue)
+{
+ m_callbacks->onSuccess(WebKit::WebSerializedScriptValue(serializedScriptValue));
+ m_callbacks.clear();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/IDBCallbacksProxy.h b/WebKit/chromium/src/IDBCallbacksProxy.h
new file mode 100644
index 0000000..8c26161
--- /dev/null
+++ b/WebKit/chromium/src/IDBCallbacksProxy.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 Google 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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.
+ */
+
+#ifndef IDBCallbacksProxy_h
+#define IDBCallbacksProxy_h
+
+#include "IDBCallbacks.h"
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebKit {
+class WebIDBCallbacks;
+}
+
+namespace WebCore {
+
+class IDBCallbacksProxy : public IDBCallbacks {
+public:
+ static PassRefPtr<IDBCallbacksProxy> create(PassOwnPtr<WebKit::WebIDBCallbacks>);
+ virtual ~IDBCallbacksProxy();
+
+ virtual void onError(PassRefPtr<IDBDatabaseError>);
+ virtual void onSuccess(); // For "null".
+ virtual void onSuccess(PassRefPtr<IDBCursorBackendInterface>);
+ virtual void onSuccess(PassRefPtr<IDBDatabaseBackendInterface>);
+ virtual void onSuccess(PassRefPtr<IDBIndexBackendInterface>);
+ virtual void onSuccess(PassRefPtr<IDBKey>);
+ virtual void onSuccess(PassRefPtr<IDBObjectStoreBackendInterface>);
+ virtual void onSuccess(PassRefPtr<IDBTransactionBackendInterface>);
+ virtual void onSuccess(PassRefPtr<SerializedScriptValue>);
+
+private:
+ IDBCallbacksProxy(PassOwnPtr<WebKit::WebIDBCallbacks>);
+
+ OwnPtr<WebKit::WebIDBCallbacks> m_callbacks;
+};
+
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBCallbacksProxy_h
diff --git a/WebKit/chromium/src/IDBCursorBackendProxy.cpp b/WebKit/chromium/src/IDBCursorBackendProxy.cpp
new file mode 100644
index 0000000..94491f9
--- /dev/null
+++ b/WebKit/chromium/src/IDBCursorBackendProxy.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "IDBCursorBackendProxy.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBAny.h"
+#include "IDBCallbacks.h"
+#include "IDBKey.h"
+#include "SerializedScriptValue.h"
+#include "WebIDBCallbacksImpl.h"
+#include "WebIDBKey.h"
+#include "WebSerializedScriptValue.h"
+
+namespace WebCore {
+
+PassRefPtr<IDBCursorBackendInterface> IDBCursorBackendProxy::create(PassOwnPtr<WebKit::WebIDBCursor> idbCursor)
+{
+ return adoptRef(new IDBCursorBackendProxy(idbCursor));
+}
+
+IDBCursorBackendProxy::IDBCursorBackendProxy(PassOwnPtr<WebKit::WebIDBCursor> idbCursor)
+ : m_idbCursor(idbCursor)
+{
+}
+
+IDBCursorBackendProxy::~IDBCursorBackendProxy()
+{
+}
+
+unsigned short IDBCursorBackendProxy::direction() const
+{
+ return m_idbCursor->direction();
+}
+
+PassRefPtr<IDBKey> IDBCursorBackendProxy::key() const
+{
+ return m_idbCursor->key();
+}
+
+PassRefPtr<IDBAny> IDBCursorBackendProxy::value() const
+{
+ WebKit::WebSerializedScriptValue webScriptValue;
+ WebKit::WebIDBKey webKey;
+ m_idbCursor->value(webScriptValue, webKey);
+ if (!webScriptValue.isNull()) {
+ ASSERT(webKey.type() == WebKit::WebIDBKey::InvalidType);
+ return IDBAny::create<SerializedScriptValue>(webScriptValue);
+ }
+ ASSERT(webKey.type() != WebKit::WebIDBKey::InvalidType);
+ return IDBAny::create<IDBKey>(webKey);
+}
+
+void IDBCursorBackendProxy::update(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec)
+{
+ m_idbCursor->update(value, new WebIDBCallbacksImpl(callbacks), ec);
+}
+
+void IDBCursorBackendProxy::continueFunction(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec)
+{
+ m_idbCursor->continueFunction(key, new WebIDBCallbacksImpl(callbacks), ec);
+}
+
+void IDBCursorBackendProxy::remove(PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec)
+{
+ m_idbCursor->remove(new WebIDBCallbacksImpl(callbacks), ec);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/IDBCursorBackendProxy.h b/WebKit/chromium/src/IDBCursorBackendProxy.h
new file mode 100644
index 0000000..0a7a288
--- /dev/null
+++ b/WebKit/chromium/src/IDBCursorBackendProxy.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef IDBCursorBackendProxy_h
+#define IDBCursorBackendProxy_h
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBCursorBackendInterface.h"
+#include "WebIDBCursor.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class IDBCursorBackendProxy : public IDBCursorBackendInterface {
+public:
+ static PassRefPtr<IDBCursorBackendInterface> create(PassOwnPtr<WebKit::WebIDBCursor>);
+ virtual ~IDBCursorBackendProxy();
+
+ virtual unsigned short direction() const;
+ virtual PassRefPtr<IDBKey> key() const;
+ virtual PassRefPtr<IDBAny> value() const;
+ virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>, ExceptionCode&);
+ virtual void continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, ExceptionCode&);
+ virtual void remove(PassRefPtr<IDBCallbacks>, ExceptionCode&);
+
+private:
+ IDBCursorBackendProxy(PassOwnPtr<WebKit::WebIDBCursor>);
+
+ OwnPtr<WebKit::WebIDBCursor> m_idbCursor;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBCursorBackendProxy_h
diff --git a/WebKit/chromium/src/IDBDatabaseProxy.cpp b/WebKit/chromium/src/IDBDatabaseProxy.cpp
new file mode 100644
index 0000000..685f53c
--- /dev/null
+++ b/WebKit/chromium/src/IDBDatabaseProxy.cpp
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "IDBDatabaseProxy.h"
+
+#include "DOMStringList.h"
+#include "IDBCallbacks.h"
+#include "IDBObjectStoreProxy.h"
+#include "IDBTransactionBackendProxy.h"
+#include "WebDOMStringList.h"
+#include "WebFrameImpl.h"
+#include "WebIDBCallbacksImpl.h"
+#include "WebIDBDatabase.h"
+#include "WebIDBDatabaseError.h"
+#include "WebIDBObjectStore.h"
+#include "WebIDBTransaction.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+PassRefPtr<IDBDatabaseBackendInterface> IDBDatabaseProxy::create(PassOwnPtr<WebKit::WebIDBDatabase> database)
+{
+ return adoptRef(new IDBDatabaseProxy(database));
+}
+
+IDBDatabaseProxy::IDBDatabaseProxy(PassOwnPtr<WebKit::WebIDBDatabase> database)
+ : m_webIDBDatabase(database)
+{
+}
+
+IDBDatabaseProxy::~IDBDatabaseProxy()
+{
+}
+
+String IDBDatabaseProxy::name() const
+{
+ return m_webIDBDatabase->name();
+}
+
+String IDBDatabaseProxy::description() const
+{
+ return m_webIDBDatabase->description();
+}
+
+String IDBDatabaseProxy::version() const
+{
+ return m_webIDBDatabase->version();
+}
+
+PassRefPtr<DOMStringList> IDBDatabaseProxy::objectStoreNames() const
+{
+ return m_webIDBDatabase->objectStoreNames();
+}
+
+PassRefPtr<IDBObjectStoreBackendInterface> IDBDatabaseProxy::createObjectStore(const String& name, const String& keyPath, bool autoIncrement, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ WebKit::WebIDBObjectStore* objectStore = m_webIDBDatabase->createObjectStore(name, keyPath, autoIncrement, *transactionProxy->getWebIDBTransaction(), ec);
+ if (!objectStore)
+ return 0;
+ return IDBObjectStoreProxy::create(objectStore);
+}
+
+void IDBDatabaseProxy::deleteObjectStore(const String& name, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBDatabase->deleteObjectStore(name, *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+void IDBDatabaseProxy::setVersion(const String& version, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec)
+{
+ m_webIDBDatabase->setVersion(version, new WebIDBCallbacksImpl(callbacks), ec);
+}
+
+PassRefPtr<IDBTransactionBackendInterface> IDBDatabaseProxy::transaction(DOMStringList* storeNames, unsigned short mode, unsigned long timeout, ExceptionCode& ec)
+{
+ WebKit::WebDOMStringList names(storeNames);
+ WebKit::WebIDBTransaction* transaction = m_webIDBDatabase->transaction(names, mode, timeout, ec);
+ if (!transaction) {
+ ASSERT(ec);
+ return 0;
+ }
+ return IDBTransactionBackendProxy::create(transaction);
+}
+
+void IDBDatabaseProxy::close()
+{
+ m_webIDBDatabase->close();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/IDBDatabaseProxy.h b/WebKit/chromium/src/IDBDatabaseProxy.h
new file mode 100644
index 0000000..84693f2
--- /dev/null
+++ b/WebKit/chromium/src/IDBDatabaseProxy.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef IDBDatabaseProxy_h
+#define IDBDatabaseProxy_h
+
+#include "IDBDatabaseBackendInterface.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebKit { class WebIDBDatabase; }
+
+namespace WebCore {
+
+class IDBDatabaseProxy : public IDBDatabaseBackendInterface {
+public:
+ static PassRefPtr<IDBDatabaseBackendInterface> create(PassOwnPtr<WebKit::WebIDBDatabase>);
+ virtual ~IDBDatabaseProxy();
+
+ virtual String name() const;
+ virtual String description() const;
+ virtual String version() const;
+ virtual PassRefPtr<DOMStringList> objectStoreNames() const;
+
+ virtual PassRefPtr<IDBObjectStoreBackendInterface> createObjectStore(const String& name, const String& keyPath, bool autoIncrement, IDBTransactionBackendInterface*, ExceptionCode&);
+ virtual void deleteObjectStore(const String& name, IDBTransactionBackendInterface*, ExceptionCode&);
+ virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, ExceptionCode&);
+ virtual PassRefPtr<IDBTransactionBackendInterface> transaction(DOMStringList* storeNames, unsigned short mode, unsigned long timeout, ExceptionCode&);
+ virtual void close();
+
+private:
+ IDBDatabaseProxy(PassOwnPtr<WebKit::WebIDBDatabase>);
+
+ OwnPtr<WebKit::WebIDBDatabase> m_webIDBDatabase;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBDatabaseProxy_h
diff --git a/WebKit/chromium/src/IDBFactoryBackendProxy.cpp b/WebKit/chromium/src/IDBFactoryBackendProxy.cpp
new file mode 100755
index 0000000..67504a3
--- /dev/null
+++ b/WebKit/chromium/src/IDBFactoryBackendProxy.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 Google 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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.
+ */
+
+#include "config.h"
+#include "IDBFactoryBackendProxy.h"
+
+#include "DOMStringList.h"
+#include "IDBDatabaseError.h"
+#include "IDBDatabaseProxy.h"
+#include "WebFrameImpl.h"
+#include "WebIDBCallbacksImpl.h"
+#include "WebIDBDatabase.h"
+#include "WebIDBDatabaseError.h"
+#include "WebIDBFactory.h"
+#include "WebKit.h"
+#include "WebKitClient.h"
+#include "WebVector.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+PassRefPtr<IDBFactoryBackendInterface> IDBFactoryBackendProxy::create()
+{
+ return adoptRef(new IDBFactoryBackendProxy());
+}
+
+IDBFactoryBackendProxy::IDBFactoryBackendProxy()
+ : m_webIDBFactory(WebKit::webKitClient()->idbFactory())
+{
+}
+
+IDBFactoryBackendProxy::~IDBFactoryBackendProxy()
+{
+}
+
+void IDBFactoryBackendProxy::open(const String& name, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<SecurityOrigin> origin, Frame* frame, const String& dataDir, int64_t maximumSize)
+{
+ WebKit::WebFrame* webFrame = WebKit::WebFrameImpl::fromFrame(frame);
+ m_webIDBFactory->open(name, new WebIDBCallbacksImpl(callbacks), origin, webFrame, dataDir, maximumSize);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
+
diff --git a/WebKit/chromium/src/IDBFactoryBackendProxy.h b/WebKit/chromium/src/IDBFactoryBackendProxy.h
new file mode 100755
index 0000000..5950a68
--- /dev/null
+++ b/WebKit/chromium/src/IDBFactoryBackendProxy.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2010 Google 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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.
+ */
+
+#ifndef IDBFactoryBackendProxy_h
+#define IDBFactoryBackendProxy_h
+
+#include "IDBFactoryBackendInterface.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebKit { class WebIDBFactory; }
+
+namespace WebCore {
+
+class DOMStringList;
+
+class IDBFactoryBackendProxy : public IDBFactoryBackendInterface {
+public:
+ static PassRefPtr<IDBFactoryBackendInterface> create();
+ virtual ~IDBFactoryBackendProxy();
+
+ PassRefPtr<DOMStringList> databases(void) const;
+ virtual void open(const String& name, PassRefPtr<IDBCallbacks>, PassRefPtr<SecurityOrigin>, Frame*, const String& dataDir, int64_t maximumSize);
+
+private:
+ IDBFactoryBackendProxy();
+
+ // We don't own this pointer (unlike all the other proxy classes which do).
+ WebKit::WebIDBFactory* m_webIDBFactory;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBFactoryBackendProxy_h
+
diff --git a/WebKit/chromium/src/IDBIndexBackendProxy.cpp b/WebKit/chromium/src/IDBIndexBackendProxy.cpp
new file mode 100644
index 0000000..410750e
--- /dev/null
+++ b/WebKit/chromium/src/IDBIndexBackendProxy.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "IDBIndexBackendProxy.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBCallbacks.h"
+#include "IDBKeyRange.h"
+#include "IDBTransactionBackendProxy.h"
+#include "WebIDBCallbacksImpl.h"
+#include "WebIDBDatabaseError.h"
+#include "WebIDBIndex.h"
+#include "WebIDBKey.h"
+#include "WebIDBKeyRange.h"
+
+namespace WebCore {
+
+PassRefPtr<IDBIndexBackendInterface> IDBIndexBackendProxy::create(PassOwnPtr<WebKit::WebIDBIndex> index)
+{
+ return adoptRef(new IDBIndexBackendProxy(index));
+}
+
+IDBIndexBackendProxy::IDBIndexBackendProxy(PassOwnPtr<WebKit::WebIDBIndex> index)
+ : m_webIDBIndex(index)
+{
+}
+
+IDBIndexBackendProxy::~IDBIndexBackendProxy()
+{
+}
+
+String IDBIndexBackendProxy::name()
+{
+ return m_webIDBIndex->name();
+}
+
+String IDBIndexBackendProxy::storeName()
+{
+ return m_webIDBIndex->storeName();
+}
+
+String IDBIndexBackendProxy::keyPath()
+{
+ return m_webIDBIndex->keyPath();
+}
+
+bool IDBIndexBackendProxy::unique()
+{
+ return m_webIDBIndex->unique();
+}
+
+void IDBIndexBackendProxy::openCursor(PassRefPtr<IDBKeyRange> keyRange, unsigned short direction, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBIndex->openObjectCursor(keyRange, direction, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+void IDBIndexBackendProxy::openKeyCursor(PassRefPtr<IDBKeyRange> keyRange, unsigned short direction, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBIndex->openKeyCursor(keyRange, direction, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+void IDBIndexBackendProxy::get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBIndex->getObject(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+void IDBIndexBackendProxy::getKey(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBIndex->getKey(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/IDBIndexBackendProxy.h b/WebKit/chromium/src/IDBIndexBackendProxy.h
new file mode 100644
index 0000000..e9de05a
--- /dev/null
+++ b/WebKit/chromium/src/IDBIndexBackendProxy.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef IDBIndexBackendProxy_h
+#define IDBIndexBackendProxy_h
+
+#include "IDBIndexBackendInterface.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebKit { class WebIDBIndex; }
+
+namespace WebCore {
+
+class IDBIndexBackendProxy : public IDBIndexBackendInterface {
+public:
+ static PassRefPtr<IDBIndexBackendInterface> create(PassOwnPtr<WebKit::WebIDBIndex>);
+ virtual ~IDBIndexBackendProxy();
+
+ virtual String name();
+ virtual String storeName();
+ virtual String keyPath();
+ virtual bool unique();
+
+ virtual void openCursor(PassRefPtr<IDBKeyRange>, unsigned short direction, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&);
+ virtual void openKeyCursor(PassRefPtr<IDBKeyRange>, unsigned short direction, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&);
+ virtual void get(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&);
+ virtual void getKey(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&);
+
+private:
+ IDBIndexBackendProxy(PassOwnPtr<WebKit::WebIDBIndex>);
+
+ OwnPtr<WebKit::WebIDBIndex> m_webIDBIndex;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBIndexBackendProxy_h
diff --git a/WebKit/chromium/src/IDBObjectStoreProxy.cpp b/WebKit/chromium/src/IDBObjectStoreProxy.cpp
new file mode 100755
index 0000000..e03cdc8
--- /dev/null
+++ b/WebKit/chromium/src/IDBObjectStoreProxy.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "IDBObjectStoreProxy.h"
+
+#include "DOMStringList.h"
+#include "IDBCallbacks.h"
+#include "IDBIndexBackendProxy.h"
+#include "IDBKeyRange.h"
+#include "IDBTransactionBackendProxy.h"
+#include "WebIDBCallbacksImpl.h"
+#include "WebIDBKeyRange.h"
+#include "WebIDBIndex.h"
+#include "WebIDBKey.h"
+#include "WebIDBObjectStore.h"
+#include "WebIDBTransactionImpl.h"
+#include "WebSerializedScriptValue.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+PassRefPtr<IDBObjectStoreBackendInterface> IDBObjectStoreProxy::create(PassOwnPtr<WebKit::WebIDBObjectStore> objectStore)
+{
+ return adoptRef(new IDBObjectStoreProxy(objectStore));
+}
+
+IDBObjectStoreProxy::IDBObjectStoreProxy(PassOwnPtr<WebKit::WebIDBObjectStore> objectStore)
+ : m_webIDBObjectStore(objectStore)
+{
+}
+
+IDBObjectStoreProxy::~IDBObjectStoreProxy()
+{
+}
+
+String IDBObjectStoreProxy::name() const
+{
+ return m_webIDBObjectStore->name();
+}
+
+String IDBObjectStoreProxy::keyPath() const
+{
+ return m_webIDBObjectStore->keyPath();
+}
+
+PassRefPtr<DOMStringList> IDBObjectStoreProxy::indexNames() const
+{
+ return m_webIDBObjectStore->indexNames();
+}
+
+void IDBObjectStoreProxy::get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBObjectStore->get(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+void IDBObjectStoreProxy::put(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, bool addOnly, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBObjectStore->put(value, key, addOnly, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+void IDBObjectStoreProxy::deleteFunction(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBObjectStore->deleteFunction(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+PassRefPtr<IDBIndexBackendInterface> IDBObjectStoreProxy::createIndex(const String& name, const String& keyPath, bool unique, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ WebKit::WebIDBIndex* index = m_webIDBObjectStore->createIndex(name, keyPath, unique, *transactionProxy->getWebIDBTransaction(), ec);
+ if (!index)
+ return 0;
+ return IDBIndexBackendProxy::create(index);
+}
+
+PassRefPtr<IDBIndexBackendInterface> IDBObjectStoreProxy::index(const String& name, ExceptionCode& ec)
+{
+ WebKit::WebIDBIndex* index = m_webIDBObjectStore->index(name, ec);
+ if (!index)
+ return 0;
+ return IDBIndexBackendProxy::create(index);
+}
+
+void IDBObjectStoreProxy::deleteIndex(const String& name, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBObjectStore->deleteIndex(name, *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+void IDBObjectStoreProxy::openCursor(PassRefPtr<IDBKeyRange> range, unsigned short direction, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction, ExceptionCode& ec)
+{
+ // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+ // all implementations of IDB interfaces are proxy objects.
+ IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+ m_webIDBObjectStore->openCursor(range, direction, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction(), ec);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/IDBObjectStoreProxy.h b/WebKit/chromium/src/IDBObjectStoreProxy.h
new file mode 100755
index 0000000..348c794
--- /dev/null
+++ b/WebKit/chromium/src/IDBObjectStoreProxy.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef IDBObjectStoreProxy_h
+#define IDBObjectStoreProxy_h
+
+#include "IDBObjectStoreBackendInterface.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebKit { class WebIDBObjectStore; }
+
+namespace WebCore {
+
+class IDBObjectStoreProxy : public IDBObjectStoreBackendInterface {
+public:
+ static PassRefPtr<IDBObjectStoreBackendInterface> create(PassOwnPtr<WebKit::WebIDBObjectStore>);
+ virtual ~IDBObjectStoreProxy();
+
+ virtual String name() const;
+ virtual String keyPath() const;
+ virtual PassRefPtr<DOMStringList> indexNames() const;
+
+ virtual void get(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&);
+ virtual void put(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBKey>, bool addOnly, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&);
+ virtual void deleteFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&);
+
+ PassRefPtr<IDBIndexBackendInterface> createIndex(const String& name, const String& keyPath, bool unique, IDBTransactionBackendInterface*, ExceptionCode&);
+ PassRefPtr<IDBIndexBackendInterface> index(const String& name, ExceptionCode&);
+ void deleteIndex(const String& name, IDBTransactionBackendInterface*, ExceptionCode&);
+
+ virtual void openCursor(PassRefPtr<IDBKeyRange>, unsigned short direction, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*, ExceptionCode&);
+
+private:
+ IDBObjectStoreProxy(PassOwnPtr<WebKit::WebIDBObjectStore>);
+
+ OwnPtr<WebKit::WebIDBObjectStore> m_webIDBObjectStore;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBObjectStoreProxy_h
+
diff --git a/WebKit/chromium/src/IDBTransactionBackendProxy.cpp b/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
new file mode 100644
index 0000000..95c90d5
--- /dev/null
+++ b/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "IDBTransactionBackendProxy.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBObjectStoreProxy.h"
+#include "IDBTransactionCallbacks.h"
+#include "WebIDBDatabaseError.h"
+#include "WebIDBObjectStore.h"
+#include "WebIDBTransaction.h"
+#include "WebIDBTransactionCallbacksImpl.h"
+
+namespace WebCore {
+
+PassRefPtr<IDBTransactionBackendInterface> IDBTransactionBackendProxy::create(PassOwnPtr<WebKit::WebIDBTransaction> transaction)
+{
+ return adoptRef(new IDBTransactionBackendProxy(transaction));
+}
+
+IDBTransactionBackendProxy::IDBTransactionBackendProxy(PassOwnPtr<WebKit::WebIDBTransaction> transaction)
+ : m_webIDBTransaction(transaction)
+{
+ ASSERT(m_webIDBTransaction);
+}
+
+IDBTransactionBackendProxy::~IDBTransactionBackendProxy()
+{
+}
+
+PassRefPtr<IDBObjectStoreBackendInterface> IDBTransactionBackendProxy::objectStore(const String& name, ExceptionCode& ec)
+{
+ WebKit::WebIDBObjectStore* objectStore = m_webIDBTransaction->objectStore(name, ec);
+ if (!objectStore)
+ return 0;
+ return IDBObjectStoreProxy::create(objectStore);
+}
+
+unsigned short IDBTransactionBackendProxy::mode() const
+{
+ return m_webIDBTransaction->mode();
+}
+
+void IDBTransactionBackendProxy::abort()
+{
+ m_webIDBTransaction->abort();
+}
+
+bool IDBTransactionBackendProxy::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>, PassOwnPtr<ScriptExecutionContext::Task>)
+{
+ // This should never be reached as it's the impl objects who get to
+ // execute tasks in the browser process.
+ ASSERT_NOT_REACHED();
+ return false;
+}
+
+void IDBTransactionBackendProxy::didCompleteTaskEvents()
+{
+ m_webIDBTransaction->didCompleteTaskEvents();
+}
+
+void IDBTransactionBackendProxy::setCallbacks(IDBTransactionCallbacks* callbacks)
+{
+ m_webIDBTransaction->setCallbacks(new WebIDBTransactionCallbacksImpl(callbacks));
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/IDBTransactionBackendProxy.h b/WebKit/chromium/src/IDBTransactionBackendProxy.h
new file mode 100644
index 0000000..96d7293
--- /dev/null
+++ b/WebKit/chromium/src/IDBTransactionBackendProxy.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef IDBTransactionBackendProxy_h
+#define IDBTransactionBackendProxy_h
+
+#include "IDBTransactionBackendInterface.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+
+namespace WebKit { class WebIDBTransaction; }
+
+namespace WebCore {
+
+class IDBTransactionBackendProxy : public IDBTransactionBackendInterface {
+public:
+ static PassRefPtr<IDBTransactionBackendInterface> create(PassOwnPtr<WebKit::WebIDBTransaction>);
+ virtual ~IDBTransactionBackendProxy();
+
+ virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name, ExceptionCode&);
+ virtual unsigned short mode() const;
+ virtual void abort();
+ virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>, PassOwnPtr<ScriptExecutionContext::Task>);
+ virtual void didCompleteTaskEvents();
+ virtual void setCallbacks(IDBTransactionCallbacks*);
+
+ WebKit::WebIDBTransaction* getWebIDBTransaction() const { return m_webIDBTransaction.get(); }
+
+private:
+ IDBTransactionBackendProxy(PassOwnPtr<WebKit::WebIDBTransaction>);
+
+ OwnPtr<WebKit::WebIDBTransaction> m_webIDBTransaction;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBTransactionBackendProxy_h
diff --git a/WebKit/chromium/src/IDBTransactionCallbacksProxy.cpp b/WebKit/chromium/src/IDBTransactionCallbacksProxy.cpp
new file mode 100644
index 0000000..3a19fe2
--- /dev/null
+++ b/WebKit/chromium/src/IDBTransactionCallbacksProxy.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 Google 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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.
+ */
+
+#include "config.h"
+#include "IDBTransactionCallbacksProxy.h"
+
+#include "WebIDBTransactionCallbacks.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+PassRefPtr<IDBTransactionCallbacksProxy> IDBTransactionCallbacksProxy::create(PassOwnPtr<WebKit::WebIDBTransactionCallbacks> callbacks)
+{
+ return adoptRef(new IDBTransactionCallbacksProxy(callbacks));
+}
+
+IDBTransactionCallbacksProxy::IDBTransactionCallbacksProxy(PassOwnPtr<WebKit::WebIDBTransactionCallbacks> callbacks)
+ : m_callbacks(callbacks)
+{
+}
+
+IDBTransactionCallbacksProxy::~IDBTransactionCallbacksProxy()
+{
+}
+
+void IDBTransactionCallbacksProxy::onAbort()
+{
+ m_callbacks->onAbort();
+ m_callbacks.clear();
+}
+
+void IDBTransactionCallbacksProxy::onComplete()
+{
+ m_callbacks->onComplete();
+ m_callbacks.clear();
+}
+
+void IDBTransactionCallbacksProxy::onTimeout()
+{
+ m_callbacks->onTimeout();
+ m_callbacks.clear();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/IDBTransactionCallbacksProxy.h b/WebKit/chromium/src/IDBTransactionCallbacksProxy.h
new file mode 100644
index 0000000..891d5c9
--- /dev/null
+++ b/WebKit/chromium/src/IDBTransactionCallbacksProxy.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2010 Google 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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.
+ */
+
+#ifndef IDBTransactionCallbacksProxy_h
+#define IDBTransactionCallbacksProxy_h
+
+#include "IDBTransactionCallbacks.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+
+namespace WebKit { class WebIDBTransactionCallbacks; }
+
+namespace WebCore {
+
+class IDBTransactionCallbacksProxy : public IDBTransactionCallbacks {
+public:
+ static PassRefPtr<IDBTransactionCallbacksProxy> create(PassOwnPtr<WebKit::WebIDBTransactionCallbacks>);
+ virtual ~IDBTransactionCallbacksProxy();
+
+ virtual void onAbort();
+ virtual void onComplete();
+ virtual void onTimeout();
+
+private:
+ IDBTransactionCallbacksProxy(PassOwnPtr<WebKit::WebIDBTransactionCallbacks>);
+
+ OwnPtr<WebKit::WebIDBTransactionCallbacks> m_callbacks;
+};
+
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBTransactionCallbacksProxy_h
diff --git a/WebKit/chromium/src/InspectorClientImpl.cpp b/WebKit/chromium/src/InspectorClientImpl.cpp
index 54550d1..77150bb 100644
--- a/WebKit/chromium/src/InspectorClientImpl.cpp
+++ b/WebKit/chromium/src/InspectorClientImpl.cpp
@@ -33,10 +33,9 @@
#include "DOMWindow.h"
#include "FloatRect.h"
-#include "InspectorController.h"
#include "NotImplemented.h"
#include "Page.h"
-#include "Settings.h"
+#include "WebDevToolsAgentImpl.h"
#include "WebRect.h"
#include "WebURL.h"
#include "WebURLRequest.h"
@@ -60,159 +59,56 @@ InspectorClientImpl::~InspectorClientImpl()
void InspectorClientImpl::inspectorDestroyed()
{
- // Our lifetime is bound to the WebViewImpl.
+ if (WebDevToolsAgentImpl* agent = devToolsAgent())
+ agent->inspectorDestroyed();
}
-Page* InspectorClientImpl::createPage()
+void InspectorClientImpl::openInspectorFrontend(InspectorController* controller)
{
- // This method should never be called in Chrome as inspector front-end lives
- // in a separate process.
- ASSERT_NOT_REACHED();
- return 0;
-}
-
-void InspectorClientImpl::showWindow()
-{
- ASSERT(m_inspectedWebView->devToolsAgentPrivate());
- m_inspectedWebView->page()->inspectorController()->setWindowVisible(true);
-}
-
-void InspectorClientImpl::closeWindow()
-{
- if (m_inspectedWebView->page())
- m_inspectedWebView->page()->inspectorController()->setWindowVisible(false);
-}
-
-bool InspectorClientImpl::windowVisible()
-{
- ASSERT(m_inspectedWebView->devToolsAgentPrivate());
- return false;
-}
-
-void InspectorClientImpl::attachWindow()
-{
- // FIXME: Implement this
-}
-
-void InspectorClientImpl::detachWindow()
-{
- // FIXME: Implement this
-}
-
-void InspectorClientImpl::setAttachedWindowHeight(unsigned int height)
-{
- // FIXME: Implement this
- notImplemented();
-}
-
-static void invalidateNodeBoundingRect(WebViewImpl* webView)
-{
- // FIXME: Is it important to just invalidate the rect of the node region
- // given that this is not on a critical codepath? In order to do so, we'd
- // have to take scrolling into account.
- const WebSize& size = webView->size();
- WebRect damagedRect(0, 0, size.width, size.height);
- if (webView->client())
- webView->client()->didInvalidateRect(damagedRect);
+ if (WebDevToolsAgentImpl* agent = devToolsAgent())
+ agent->openInspectorFrontend(controller);
}
void InspectorClientImpl::highlight(Node* node)
{
- // InspectorController does the actually tracking of the highlighted node
- // and the drawing of the highlight. Here we just make sure to invalidate
- // the rects of the old and new nodes.
- hideHighlight();
+ if (WebDevToolsAgentImpl* agent = devToolsAgent())
+ agent->highlight(node);
}
void InspectorClientImpl::hideHighlight()
{
- // FIXME: able to invalidate a smaller rect.
- invalidateNodeBoundingRect(m_inspectedWebView);
-}
-
-void InspectorClientImpl::inspectedURLChanged(const String& newURL)
-{
- // FIXME: Implement this
-}
-
-String InspectorClientImpl::localizedStringsURL()
-{
- notImplemented();
- return String();
-}
-
-String InspectorClientImpl::hiddenPanels()
-{
- notImplemented();
- return "";
+ if (WebDevToolsAgentImpl* agent = devToolsAgent())
+ agent->hideHighlight();
}
void InspectorClientImpl::populateSetting(const String& key, String* value)
{
- loadSettings();
- if (m_settings->contains(key))
- *value = m_settings->get(key);
+ if (WebDevToolsAgentImpl* agent = devToolsAgent())
+ agent->populateSetting(key, value);
}
void InspectorClientImpl::storeSetting(const String& key, const String& value)
{
- loadSettings();
- m_settings->set(key, value);
- saveSettings();
+ if (WebDevToolsAgentImpl* agent = devToolsAgent())
+ agent->storeSetting(key, value);
}
-void InspectorClientImpl::inspectorWindowObjectCleared()
+bool InspectorClientImpl::sendMessageToFrontend(const WTF::String& message)
{
- notImplemented();
+ if (WebDevToolsAgentImpl* agent = devToolsAgent())
+ return agent->sendMessageToFrontend(message);
+ return false;
}
-void InspectorClientImpl::loadSettings()
+void InspectorClientImpl::updateInspectorStateCookie(const WTF::String& inspectorState)
{
- if (m_settings)
- return;
-
- m_settings.set(new SettingsMap);
- String data = m_inspectedWebView->inspectorSettings();
- if (data.isEmpty())
- return;
-
- Vector<String> entries;
- data.split("\n", entries);
- for (Vector<String>::iterator it = entries.begin(); it != entries.end(); ++it) {
- Vector<String> tokens;
- it->split(":", tokens);
- if (tokens.size() < 3)
- continue;
-
- String name = decodeURLEscapeSequences(tokens[0]);
- String type = tokens[1];
- String value = tokens[2];
- for (size_t i = 3; i < tokens.size(); ++i)
- value += ":" + tokens[i];
-
- if (type == "string")
- value = decodeURLEscapeSequences(value);
-
- m_settings->set(name, value);
- }
+ if (WebDevToolsAgentImpl* agent = devToolsAgent())
+ agent->updateInspectorStateCookie(inspectorState);
}
-void InspectorClientImpl::saveSettings()
+WebDevToolsAgentImpl* InspectorClientImpl::devToolsAgent()
{
- String data;
- for (SettingsMap::iterator it = m_settings->begin(); it != m_settings->end(); ++it) {
- String name = encodeWithURLEscapeSequences(it->first);
- String value = it->second;
- String entry = String::format(
- "%s:string:%s",
- name.utf8().data(),
- encodeWithURLEscapeSequences(value).utf8().data());
- data.append(entry);
- data.append("\n");
- }
- m_inspectedWebView->setInspectorSettings(data);
- if (m_inspectedWebView->client())
- m_inspectedWebView->client()->didUpdateInspectorSettings();
+ return static_cast<WebDevToolsAgentImpl*>(m_inspectedWebView->devToolsAgent());
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/InspectorClientImpl.h b/WebKit/chromium/src/InspectorClientImpl.h
index 6f7f8b1..78d34e3 100644
--- a/WebKit/chromium/src/InspectorClientImpl.h
+++ b/WebKit/chromium/src/InspectorClientImpl.h
@@ -36,6 +36,9 @@
#include <wtf/OwnPtr.h>
namespace WebKit {
+
+class WebDevToolsAgentClient;
+class WebDevToolsAgentImpl;
class WebViewImpl;
class InspectorClientImpl : public WebCore::InspectorClient {
@@ -45,35 +48,22 @@ public:
// InspectorClient methods:
virtual void inspectorDestroyed();
- virtual WebCore::Page* createPage();
- virtual WebCore::String localizedStringsURL();
- virtual WebCore::String hiddenPanels();
- virtual void showWindow();
- virtual void closeWindow();
- virtual bool windowVisible();
- virtual void attachWindow();
- virtual void detachWindow();
- virtual void setAttachedWindowHeight(unsigned height);
+ virtual void openInspectorFrontend(WebCore::InspectorController*);
+
virtual void highlight(WebCore::Node*);
virtual void hideHighlight();
- virtual void inspectedURLChanged(const WebCore::String& newURL);
- virtual void populateSetting(
- const WebCore::String& key,
- WebCore::String* value);
- virtual void storeSetting(
- const WebCore::String& key,
- const WebCore::String& value);
- virtual void inspectorWindowObjectCleared();
+ virtual void populateSetting(const WTF::String& key, WTF::String* value);
+ virtual void storeSetting(const WTF::String& key, const WTF::String& value);
+
+ virtual bool sendMessageToFrontend(const WTF::String&);
+
+ virtual void updateInspectorStateCookie(const WTF::String&);
private:
- void loadSettings();
- void saveSettings();
+ WebDevToolsAgentImpl* devToolsAgent();
// The WebViewImpl of the page being inspected; gets passed to the constructor
WebViewImpl* m_inspectedWebView;
-
- typedef HashMap<WebCore::String, WebCore::String> SettingsMap;
- OwnPtr<SettingsMap> m_settings;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/InspectorFrontendClientImpl.cpp b/WebKit/chromium/src/InspectorFrontendClientImpl.cpp
new file mode 100644
index 0000000..51864f1
--- /dev/null
+++ b/WebKit/chromium/src/InspectorFrontendClientImpl.cpp
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "InspectorFrontendClientImpl.h"
+
+#include "Document.h"
+#include "Frame.h"
+#include "InspectorFrontendHost.h"
+#include "Page.h"
+#include "PlatformString.h"
+#include "V8InspectorFrontendHost.h"
+#include "V8Proxy.h"
+#include "WebDevToolsFrontendClient.h"
+#include "WebDevToolsFrontendImpl.h"
+#include "WebString.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+InspectorFrontendClientImpl::InspectorFrontendClientImpl(Page* frontendPage, WebDevToolsFrontendClient* client, WebDevToolsFrontendImpl* frontend)
+ : m_frontendPage(frontendPage)
+ , m_client(client)
+ , m_frontend(frontend)
+{
+}
+
+InspectorFrontendClientImpl::~InspectorFrontendClientImpl()
+{
+ if (m_frontendHost)
+ m_frontendHost->disconnectClient();
+ m_client = 0;
+}
+
+void InspectorFrontendClientImpl::windowObjectCleared()
+{
+ v8::HandleScope handleScope;
+ v8::Handle<v8::Context> frameContext = V8Proxy::context(m_frontendPage->mainFrame());
+ v8::Context::Scope contextScope(frameContext);
+
+ ASSERT(!m_frontendHost);
+ m_frontendHost = InspectorFrontendHost::create(this, m_frontendPage);
+ v8::Handle<v8::Value> frontendHostObj = toV8(m_frontendHost.get());
+ v8::Handle<v8::Object> global = frameContext->Global();
+
+ global->Set(v8::String::New("InspectorFrontendHost"), frontendHostObj);
+}
+
+void InspectorFrontendClientImpl::frontendLoaded()
+{
+ m_frontend->frontendLoaded();
+}
+
+void InspectorFrontendClientImpl::moveWindowBy(float x, float y)
+{
+}
+
+String InspectorFrontendClientImpl::localizedStringsURL()
+{
+ return "";
+}
+
+String InspectorFrontendClientImpl::hiddenPanels()
+{
+ if (m_client->shouldHideScriptsPanel())
+ return "scripts";
+ return "";
+}
+
+void InspectorFrontendClientImpl::bringToFront()
+{
+ m_client->activateWindow();
+}
+
+void InspectorFrontendClientImpl::closeWindow()
+{
+ m_client->closeWindow();
+}
+
+void InspectorFrontendClientImpl::disconnectFromBackend()
+{
+ m_client->closeWindow();
+}
+
+void InspectorFrontendClientImpl::requestAttachWindow()
+{
+ m_client->requestDockWindow();
+}
+
+void InspectorFrontendClientImpl::requestDetachWindow()
+{
+ m_client->requestUndockWindow();
+}
+
+void InspectorFrontendClientImpl::changeAttachedWindowHeight(unsigned)
+{
+ // Do nothing;
+}
+
+void InspectorFrontendClientImpl::inspectedURLChanged(const String& url)
+{
+ m_frontendPage->mainFrame()->document()->setTitle("Developer Tools - " + url);
+}
+
+void InspectorFrontendClientImpl::sendMessageToBackend(const String& message)
+{
+ m_client->sendMessageToBackend(message);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/InspectorFrontendClientImpl.h b/WebKit/chromium/src/InspectorFrontendClientImpl.h
new file mode 100644
index 0000000..fc21f3e
--- /dev/null
+++ b/WebKit/chromium/src/InspectorFrontendClientImpl.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef InspectorFrontendClientImpl_h
+#define InspectorFrontendClientImpl_h
+
+#include "InspectorFrontendClient.h"
+#include <wtf/Noncopyable.h>
+
+namespace WebCore {
+class InspectorFrontendHost;
+class Page;
+}
+
+namespace WebKit {
+
+class WebDevToolsFrontendClient;
+class WebDevToolsFrontendImpl;
+
+class InspectorFrontendClientImpl : public WebCore::InspectorFrontendClient
+ , public Noncopyable {
+public:
+ InspectorFrontendClientImpl(WebCore::Page*, WebDevToolsFrontendClient*, WebDevToolsFrontendImpl*);
+ virtual ~InspectorFrontendClientImpl();
+
+ // InspectorFrontendClient methods:
+ virtual void windowObjectCleared();
+ virtual void frontendLoaded();
+
+ virtual void moveWindowBy(float x, float y);
+
+ virtual WTF::String localizedStringsURL();
+ virtual WTF::String hiddenPanels();
+
+ virtual void bringToFront();
+ virtual void closeWindow();
+ virtual void disconnectFromBackend();
+
+ virtual void requestAttachWindow();
+ virtual void requestDetachWindow();
+ virtual void changeAttachedWindowHeight(unsigned);
+
+ virtual void inspectedURLChanged(const WTF::String&);
+
+ virtual void sendMessageToBackend(const WTF::String&);
+private:
+ WebCore::Page* m_frontendPage;
+ WebDevToolsFrontendClient* m_client;
+ WebDevToolsFrontendImpl* m_frontend;
+ RefPtr<WebCore::InspectorFrontendHost> m_frontendHost;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/WebKit/chromium/src/LocalFileSystemChromium.cpp b/WebKit/chromium/src/LocalFileSystemChromium.cpp
new file mode 100644
index 0000000..a9c61d0
--- /dev/null
+++ b/WebKit/chromium/src/LocalFileSystemChromium.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "LocalFileSystem.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileSystem.h"
+#include "ErrorCallback.h"
+#include "FileSystemCallback.h"
+#include "FileSystemCallbacks.h"
+#include "PlatformString.h"
+#include "WebFileSystem.h"
+#include "WebFileSystemCallbacksImpl.h"
+#include "WebFrameClient.h"
+#include "WebFrameImpl.h"
+#include "WebWorkerImpl.h"
+#include "WorkerContext.h"
+#include "WorkerThread.h"
+#include <wtf/Threading.h>
+
+using namespace WebKit;
+
+namespace WebCore {
+
+LocalFileSystem& LocalFileSystem::localFileSystem()
+{
+ AtomicallyInitializedStatic(LocalFileSystem*, localFileSystem = new LocalFileSystem(""));
+ return *localFileSystem;
+}
+
+void LocalFileSystem::readFileSystem(ScriptExecutionContext* context, AsyncFileSystem::Type type, long long size, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ ASSERT(context && context->isDocument());
+ Document* document = static_cast<Document*>(context);
+ WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame());
+ webFrame->client()->openFileSystem(webFrame, static_cast<WebFileSystem::Type>(type), size, false, new WebFileSystemCallbacksImpl(callbacks));
+}
+
+void LocalFileSystem::requestFileSystem(ScriptExecutionContext* context, AsyncFileSystem::Type type, long long size, PassOwnPtr<AsyncFileSystemCallbacks> callbacks, bool synchronous)
+{
+ ASSERT(context);
+ if (context->isDocument()) {
+ Document* document = static_cast<Document*>(context);
+ WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame());
+ webFrame->client()->openFileSystem(webFrame, static_cast<WebFileSystem::Type>(type), size, true, new WebFileSystemCallbacksImpl(callbacks));
+ } else {
+ WorkerContext* workerContext = static_cast<WorkerContext*>(context);
+ WorkerLoaderProxy* workerLoaderProxy = &workerContext->thread()->workerLoaderProxy();
+ WebWorkerBase* webWorker = static_cast<WebWorkerBase*>(workerLoaderProxy);
+ webWorker->openFileSystem(static_cast<WebFileSystem::Type>(type), size, new WebFileSystemCallbacksImpl(callbacks, context, synchronous), synchronous);
+ }
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebKit/chromium/src/LocalizedStrings.cpp b/WebKit/chromium/src/LocalizedStrings.cpp
index 4e01848..e7b39d5 100644
--- a/WebKit/chromium/src/LocalizedStrings.cpp
+++ b/WebKit/chromium/src/LocalizedStrings.cpp
@@ -33,14 +33,15 @@
#include "IntSize.h"
#include "NotImplemented.h"
-#include "PlatformString.h"
-#include "StringBuilder.h"
#include "WebKit.h"
#include "WebKitClient.h"
#include "WebLocalizedString.h"
#include "WebString.h"
+#include <wtf/text/StringBuilder.h>
+#include <wtf/text/WTFString.h>
+
using WebKit::WebLocalizedString;
namespace WebCore {
@@ -93,6 +94,7 @@ String searchMenuRecentSearchesText()
{
return query(WebLocalizedString::SearchMenuRecentSearchesText);
}
+
String searchMenuClearRecentSearchesText()
{
return query(WebLocalizedString::SearchMenuClearRecentSearchesText);
@@ -174,6 +176,18 @@ String AXMenuListActionVerb()
{
return String();
}
+
+String missingPluginText()
+{
+ notImplemented();
+ return String("Missing Plug-in");
+}
+
+String crashedPluginText()
+{
+ notImplemented();
+ return String("Plug-in Failure");
+}
String multipleFileUploadText(unsigned numberOfFiles)
{
@@ -201,14 +215,13 @@ String keygenMenuMediumGradeKeySize()
// Used in ImageDocument.cpp as the title for pages when that page is an image.
String imageTitle(const String& filename, const IntSize& size)
{
- // Note that we cannot use String::format because it works for ASCII only.
StringBuilder result;
result.append(filename);
result.append(" (");
result.append(String::number(size.width()));
result.append(static_cast<UChar>(0xD7)); // U+00D7 (multiplication sign)
result.append(String::number(size.height()));
- result.append(")");
+ result.append(')');
return result.toString();
}
@@ -253,6 +266,16 @@ String contextMenuItemTagInspectElement() { return String(); }
String contextMenuItemTagShowSpellingPanel(bool show) { return String(); }
String mediaElementLiveBroadcastStateText() { return String(); }
String mediaElementLoadingStateText() { return String(); }
+String contextMenuItemTagOpenVideoInNewWindow() { return String(); }
+String contextMenuItemTagOpenAudioInNewWindow() { return String(); }
+String contextMenuItemTagCopyVideoLinkToClipboard() { return String(); }
+String contextMenuItemTagCopyAudioLinkToClipboard() { return String(); }
+String contextMenuItemTagToggleMediaControls() { return String(); }
+String contextMenuItemTagToggleMediaLoop() { return String(); }
+String contextMenuItemTagEnterVideoFullscreen() { return String(); }
+String contextMenuItemTagMediaPlay() { return String(); }
+String contextMenuItemTagMediaPause() { return String(); }
+String contextMenuItemTagMediaMute() { return String(); }
String localizedMediaControlElementString(const String& /*name*/)
{
@@ -274,44 +297,81 @@ String localizedMediaTimeDescription(float /*time*/)
String validationMessageValueMissingText()
{
- notImplemented();
- return String();
+ return query(WebLocalizedString::ValidationValueMissing);
+}
+
+String validationMessageValueMissingForCheckboxText()
+{
+ return query(WebLocalizedString::ValidationValueMissingForCheckbox);
+}
+
+String validationMessageValueMissingForFileText()
+{
+ return query(WebLocalizedString::ValidationValueMissingForFile);
+}
+
+String validationMessageValueMissingForMultipleFileText()
+{
+ return query(WebLocalizedString::ValidationValueMissingForMultipleFile);
+}
+
+String validationMessageValueMissingForRadioText()
+{
+ return query(WebLocalizedString::ValidationValueMissingForRadio);
+}
+
+String validationMessageValueMissingForSelectText()
+{
+ return query(WebLocalizedString::ValidationValueMissingForSelect);
}
String validationMessageTypeMismatchText()
{
- notImplemented();
- return String();
+ return query(WebLocalizedString::ValidationTypeMismatch);
+}
+
+String validationMessageTypeMismatchForEmailText()
+{
+ return query(WebLocalizedString::ValidationTypeMismatchForEmail);
+}
+
+String validationMessageTypeMismatchForMultipleEmailText()
+{
+ return query(WebLocalizedString::ValidationTypeMismatchForMultipleEmail);
+}
+
+String validationMessageTypeMismatchForURLText()
+{
+ return query(WebLocalizedString::ValidationTypeMismatchForURL);
}
String validationMessagePatternMismatchText()
{
- notImplemented();
- return String();
+ return query(WebLocalizedString::ValidationPatternMismatch);
}
-String validationMessageTooLongText()
+String validationMessageTooLongText(int, int)
{
- notImplemented();
- return String();
+ // FIXME: pass the arguments.
+ return query(WebLocalizedString::ValidationTooLong);
}
-String validationMessageRangeUnderflowText()
+String validationMessageRangeUnderflowText(const String&)
{
- notImplemented();
- return String();
+ // FIXME: pass the arguments.
+ return query(WebLocalizedString::ValidationRangeUnderflow);
}
-String validationMessageRangeOverflowText()
+String validationMessageRangeOverflowText(const String&)
{
- notImplemented();
- return String();
+ // FIXME: pass the arguments.
+ return query(WebLocalizedString::ValidationRangeOverflow);
}
-String validationMessageStepMismatchText()
+String validationMessageStepMismatchText(const String&, const String&)
{
- notImplemented();
- return String();
+ // FIXME: pass the arguments.
+ return query(WebLocalizedString::ValidationStepMismatch);
}
} // namespace WebCore
diff --git a/WebKit/chromium/src/NotificationPresenterImpl.cpp b/WebKit/chromium/src/NotificationPresenterImpl.cpp
index a38b8b5..1931465 100644
--- a/WebKit/chromium/src/NotificationPresenterImpl.cpp
+++ b/WebKit/chromium/src/NotificationPresenterImpl.cpp
@@ -33,11 +33,11 @@
#if ENABLE(NOTIFICATIONS)
-#include "Document.h"
+#include "KURL.h"
#include "Notification.h"
+#include "ScriptExecutionContext.h"
#include "SecurityOrigin.h"
-#include "WebDocument.h"
#include "WebNotification.h"
#include "WebNotificationPermissionCallback.h"
#include "WebNotificationPresenter.h"
@@ -92,19 +92,15 @@ void NotificationPresenterImpl::notificationObjectDestroyed(Notification* notifi
m_presenter->objectDestroyed(PassRefPtr<Notification>(notification));
}
-NotificationPresenter::Permission NotificationPresenterImpl::checkPermission(const KURL& url, Document* document)
+NotificationPresenter::Permission NotificationPresenterImpl::checkPermission(ScriptExecutionContext* context)
{
- WebDocument webDocument;
- if (document)
- webDocument = document;
-
- int result = m_presenter->checkPermission(url, document ? &webDocument : 0);
+ int result = m_presenter->checkPermission(context->url());
return static_cast<NotificationPresenter::Permission>(result);
}
-void NotificationPresenterImpl::requestPermission(SecurityOrigin* origin, PassRefPtr<VoidCallback> callback)
+void NotificationPresenterImpl::requestPermission(ScriptExecutionContext* context, PassRefPtr<VoidCallback> callback)
{
- m_presenter->requestPermission(origin->toString(), new VoidCallbackClient(callback));
+ m_presenter->requestPermission(WebSecurityOrigin(context->securityOrigin()), new VoidCallbackClient(callback));
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/NotificationPresenterImpl.h b/WebKit/chromium/src/NotificationPresenterImpl.h
index 8e3799c..bb156dd 100644
--- a/WebKit/chromium/src/NotificationPresenterImpl.h
+++ b/WebKit/chromium/src/NotificationPresenterImpl.h
@@ -54,8 +54,9 @@ public:
virtual bool show(WebCore::Notification* object);
virtual void cancel(WebCore::Notification* object);
virtual void notificationObjectDestroyed(WebCore::Notification* object);
- virtual WebCore::NotificationPresenter::Permission checkPermission(const WebCore::KURL& url, WebCore::Document* document);
- virtual void requestPermission(WebCore::SecurityOrigin* origin, WTF::PassRefPtr<WebCore::VoidCallback> callback);
+ virtual WebCore::NotificationPresenter::Permission checkPermission(WebCore::ScriptExecutionContext*);
+ virtual void requestPermission(WebCore::ScriptExecutionContext* , WTF::PassRefPtr<WebCore::VoidCallback> callback);
+ virtual void cancelRequestsForPermission(WebCore::ScriptExecutionContext*) {}
private:
// WebNotificationPresenter that this object delegates to.
diff --git a/WebKit/chromium/src/PlatformMessagePortChannel.h b/WebKit/chromium/src/PlatformMessagePortChannel.h
index 05e8397..5416145 100644
--- a/WebKit/chromium/src/PlatformMessagePortChannel.h
+++ b/WebKit/chromium/src/PlatformMessagePortChannel.h
@@ -31,12 +31,9 @@
#ifndef PlatformMessagePortChannel_h
#define PlatformMessagePortChannel_h
-// FIXME: This relative path is a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebMessagePortChannelClient.h"
+#include "WebMessagePortChannelClient.h"
#include "MessagePortChannel.h"
-
#include <wtf/PassRefPtr.h>
#include <wtf/Threading.h>
diff --git a/WebKit/chromium/src/ResourceHandle.cpp b/WebKit/chromium/src/ResourceHandle.cpp
index bf6910f..83e0017 100644
--- a/WebKit/chromium/src/ResourceHandle.cpp
+++ b/WebKit/chromium/src/ResourceHandle.cpp
@@ -31,8 +31,10 @@
#include "config.h"
#include "ResourceHandle.h"
+#include "ChromiumBridge.h"
#include "ResourceHandleClient.h"
#include "ResourceRequest.h"
+#include "SharedBuffer.h"
#include "WebKit.h"
#include "WebKitClient.h"
@@ -56,6 +58,7 @@ public:
: m_request(request)
, m_owner(0)
, m_client(client)
+ , m_state(ConnectionStateNew)
{
}
@@ -70,17 +73,36 @@ public:
WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
virtual void didReceiveResponse(WebURLLoader*, const WebURLResponse&);
virtual void didReceiveData(WebURLLoader*, const char* data, int dataLength);
- virtual void didFinishLoading(WebURLLoader*);
+ virtual void didReceiveCachedMetadata(WebURLLoader*, const char* data, int dataLength);
+ virtual void didFinishLoading(WebURLLoader*, double finishTime);
virtual void didFail(WebURLLoader*, const WebURLError&);
+ enum ConnectionState {
+ ConnectionStateNew,
+ ConnectionStateStarted,
+ ConnectionStateReceivedResponse,
+ ConnectionStateReceivingData,
+ ConnectionStateFinishedLoading,
+ ConnectionStateCanceled,
+ ConnectionStateFailed,
+ };
+
ResourceRequest m_request;
ResourceHandle* m_owner;
ResourceHandleClient* m_client;
OwnPtr<WebURLLoader> m_loader;
+
+ // Used for sanity checking to make sure we don't experience illegal state
+ // transitions.
+ ConnectionState m_state;
};
void ResourceHandleInternal::start()
{
+ if (m_state != ConnectionStateNew)
+ CRASH();
+ m_state = ConnectionStateStarted;
+
m_loader.set(webKitClient()->createURLLoader());
ASSERT(m_loader.get());
@@ -91,6 +113,7 @@ void ResourceHandleInternal::start()
void ResourceHandleInternal::cancel()
{
+ m_state = ConnectionStateCanceled;
m_loader->cancel();
// Do not make any further calls to the client.
@@ -127,6 +150,12 @@ void ResourceHandleInternal::didReceiveResponse(WebURLLoader*, const WebURLRespo
{
ASSERT(m_client);
ASSERT(!response.isNull());
+ bool isMultipart = response.isMultipartPayload();
+ bool isValidStateTransition = (m_state == ConnectionStateStarted || m_state == ConnectionStateReceivedResponse);
+ // In the case of multipart loads, calls to didReceiveData & didReceiveResponse can be interleaved.
+ if (!isMultipart && !isValidStateTransition)
+ CRASH();
+ m_state = ConnectionStateReceivedResponse;
m_client->didReceiveResponse(m_owner, response.toResourceResponse());
}
@@ -134,6 +163,9 @@ void ResourceHandleInternal::didReceiveData(
WebURLLoader*, const char* data, int dataLength)
{
ASSERT(m_client);
+ if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData)
+ CRASH();
+ m_state = ConnectionStateReceivingData;
// FIXME(yurys): it looks like lengthReceived is always the same as
// dataLength and that the latter parameter can be eliminated.
@@ -141,15 +173,28 @@ void ResourceHandleInternal::didReceiveData(
m_client->didReceiveData(m_owner, data, dataLength, dataLength);
}
-void ResourceHandleInternal::didFinishLoading(WebURLLoader*)
+void ResourceHandleInternal::didReceiveCachedMetadata(WebURLLoader*, const char* data, int dataLength)
+{
+ ASSERT(m_client);
+ if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData)
+ CRASH();
+
+ m_client->didReceiveCachedMetadata(m_owner, data, dataLength);
+}
+
+void ResourceHandleInternal::didFinishLoading(WebURLLoader*, double finishTime)
{
ASSERT(m_client);
- m_client->didFinishLoading(m_owner);
+ if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData)
+ CRASH();
+ m_state = ConnectionStateFinishedLoading;
+ m_client->didFinishLoading(m_owner, finishTime);
}
void ResourceHandleInternal::didFail(WebURLLoader*, const WebURLError& error)
{
ASSERT(m_client);
+ m_state = ConnectionStateFailed;
m_client->didFail(m_owner, error);
}
@@ -158,8 +203,7 @@ void ResourceHandleInternal::didFail(WebURLLoader*, const WebURLError& error)
ResourceHandle::ResourceHandle(const ResourceRequest& request,
ResourceHandleClient* client,
bool defersLoading,
- bool shouldContentSniff,
- bool mightDownloadFromHandle)
+ bool shouldContentSniff)
: d(new ResourceHandleInternal(request, client))
{
d->m_owner = this;
@@ -167,23 +211,22 @@ ResourceHandle::ResourceHandle(const ResourceRequest& request,
// FIXME: Figure out what to do with the bool params.
}
-PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request,
+PassRefPtr<ResourceHandle> ResourceHandle::create(NetworkingContext* context,
+ const ResourceRequest& request,
ResourceHandleClient* client,
- Frame* deprecated,
bool defersLoading,
- bool shouldContentSniff,
- bool mightDownloadFromHandle)
+ bool shouldContentSniff)
{
RefPtr<ResourceHandle> newHandle = adoptRef(new ResourceHandle(
- request, client, defersLoading, shouldContentSniff, mightDownloadFromHandle));
+ request, client, defersLoading, shouldContentSniff));
- if (newHandle->start(deprecated))
+ if (newHandle->start(context))
return newHandle.release();
return 0;
}
-const ResourceRequest& ResourceHandle::request() const
+ResourceRequest& ResourceHandle::firstRequest()
{
return d->m_request;
}
@@ -203,12 +246,17 @@ void ResourceHandle::setDefersLoading(bool value)
d->setDefersLoading(value);
}
-bool ResourceHandle::start(Frame* deprecated)
+bool ResourceHandle::start(NetworkingContext* context)
{
d->start();
return true;
}
+bool ResourceHandle::hasAuthenticationChallenge() const
+{
+ return false;
+}
+
void ResourceHandle::clearAuthentication()
{
}
@@ -240,12 +288,12 @@ bool ResourceHandle::supportsBufferedData()
}
// static
-void ResourceHandle::loadResourceSynchronously(const ResourceRequest& request,
+void ResourceHandle::loadResourceSynchronously(NetworkingContext* context,
+ const ResourceRequest& request,
StoredCredentials storedCredentials,
ResourceError& error,
ResourceResponse& response,
- Vector<char>& data,
- Frame* deprecated)
+ Vector<char>& data)
{
OwnPtr<WebURLLoader> loader(webKitClient()->createURLLoader());
ASSERT(loader.get());
@@ -279,4 +327,10 @@ bool ResourceHandle::willLoadFromCache(ResourceRequest& request, Frame*)
return true;
}
+// static
+void ResourceHandle::cacheMetadata(const ResourceResponse& response, const Vector<char>& data)
+{
+ ChromiumBridge::cacheMetadata(response.url(), response.responseTime(), data);
+}
+
} // namespace WebCore
diff --git a/WebKit/chromium/src/SharedWorkerRepository.cpp b/WebKit/chromium/src/SharedWorkerRepository.cpp
index c803aac..88d3ec5 100644
--- a/WebKit/chromium/src/SharedWorkerRepository.cpp
+++ b/WebKit/chromium/src/SharedWorkerRepository.cpp
@@ -36,6 +36,7 @@
#include "Event.h"
#include "EventNames.h"
+#include "InspectorController.h"
#include "MessagePortChannel.h"
#include "PlatformMessagePortChannel.h"
#include "ScriptExecutionContext.h"
@@ -69,7 +70,9 @@ public:
, m_name(name)
, m_webWorker(webWorker)
, m_port(port)
+ , m_scriptLoader(ResourceRequestBase::TargetIsSharedWorker)
, m_loading(false)
+ , m_responseAppCacheID(0)
{
}
@@ -79,6 +82,7 @@ public:
private:
// WorkerScriptLoaderClient callback
+ virtual void didReceiveResponse(const ResourceResponse&);
virtual void notifyFinished();
virtual void connected();
@@ -94,6 +98,7 @@ private:
OwnPtr<MessagePortChannel> m_port;
WorkerScriptLoader m_scriptLoader;
bool m_loading;
+ long long m_responseAppCacheID;
};
static Vector<SharedWorkerScriptLoader*>& pendingLoaders()
@@ -146,14 +151,23 @@ static WebMessagePortChannel* getWebPort(PassOwnPtr<MessagePortChannel> port)
return webPort;
}
+void SharedWorkerScriptLoader::didReceiveResponse(const ResourceResponse& response)
+{
+ m_responseAppCacheID = response.appCacheID();
+}
+
void SharedWorkerScriptLoader::notifyFinished()
{
if (m_scriptLoader.failed()) {
m_worker->dispatchEvent(Event::create(eventNames().errorEvent, false, true));
delete this;
} else {
+#if ENABLE(INSPECTOR)
+ if (InspectorController* inspector = m_worker->scriptExecutionContext()->inspectorController())
+ inspector->scriptImported(m_scriptLoader.identifier(), m_scriptLoader.script());
+#endif
// Pass the script off to the worker, then send a connect event.
- m_webWorker->startWorkerContext(m_url, m_name, m_worker->scriptExecutionContext()->userAgent(m_url), m_scriptLoader.script());
+ m_webWorker->startWorkerContext(m_url, m_name, m_worker->scriptExecutionContext()->userAgent(m_url), m_scriptLoader.script(), m_responseAppCacheID);
sendConnect();
}
}
@@ -206,7 +220,7 @@ void SharedWorkerRepository::connect(PassRefPtr<SharedWorker> worker, PassOwnPtr
// The loader object manages its own lifecycle (and the lifecycles of the two worker objects).
// It will free itself once loading is completed.
- SharedWorkerScriptLoader* loader = new SharedWorkerScriptLoader(worker, url, name, port.release(), webWorker.release());
+ SharedWorkerScriptLoader* loader = new SharedWorkerScriptLoader(worker, url, name, port, webWorker.release());
loader->load();
}
diff --git a/WebKit/chromium/src/SpeechInputClientImpl.cpp b/WebKit/chromium/src/SpeechInputClientImpl.cpp
new file mode 100644
index 0000000..b5ed384
--- /dev/null
+++ b/WebKit/chromium/src/SpeechInputClientImpl.cpp
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "SpeechInputClientImpl.h"
+
+#include "PlatformString.h"
+#include "SpeechInputListener.h"
+#include "WebSpeechInputController.h"
+#include "WebString.h"
+#include "WebViewClient.h"
+#include <wtf/PassOwnPtr.h>
+
+#if ENABLE(INPUT_SPEECH)
+
+namespace WebKit {
+
+PassOwnPtr<SpeechInputClientImpl> SpeechInputClientImpl::create(WebViewClient* client)
+{
+ return adoptPtr(new SpeechInputClientImpl(client));
+}
+
+SpeechInputClientImpl::SpeechInputClientImpl(WebViewClient* web_view_client)
+ : m_controller(web_view_client ? web_view_client->speechInputController(this) : 0)
+ , m_listener(0)
+{
+}
+
+SpeechInputClientImpl::~SpeechInputClientImpl()
+{
+}
+
+void SpeechInputClientImpl::setListener(WebCore::SpeechInputListener* listener)
+{
+ m_listener = listener;
+}
+
+bool SpeechInputClientImpl::startRecognition(int requestId, const WebCore::IntRect& elementRect, const AtomicString& language, const String& grammar)
+{
+ ASSERT(m_listener);
+ return m_controller->startRecognition(requestId, elementRect, language, grammar);
+}
+
+void SpeechInputClientImpl::stopRecording(int requestId)
+{
+ ASSERT(m_listener);
+ m_controller->stopRecording(requestId);
+}
+
+void SpeechInputClientImpl::cancelRecognition(int requestId)
+{
+ ASSERT(m_listener);
+ m_controller->cancelRecognition(requestId);
+}
+
+void SpeechInputClientImpl::didCompleteRecording(int requestId)
+{
+ ASSERT(m_listener);
+ m_listener->didCompleteRecording(requestId);
+}
+
+void SpeechInputClientImpl::didCompleteRecognition(int requestId)
+{
+ ASSERT(m_listener);
+ m_listener->didCompleteRecognition(requestId);
+}
+
+void SpeechInputClientImpl::setRecognitionResult(int requestId, const WebSpeechInputResultArray& results)
+{
+ ASSERT(m_listener);
+ WebCore::SpeechInputResultArray webcoreResults(results.size());
+ for (size_t i = 0; i < results.size(); ++i)
+ webcoreResults[i] = results[i];
+ m_listener->setRecognitionResult(requestId, webcoreResults);
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(INPUT_SPEECH)
diff --git a/WebKit/chromium/src/SpeechInputClientImpl.h b/WebKit/chromium/src/SpeechInputClientImpl.h
new file mode 100644
index 0000000..520803a
--- /dev/null
+++ b/WebKit/chromium/src/SpeechInputClientImpl.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef SpeechInputClientImpl_h
+#define SpeechInputClientImpl_h
+
+#if ENABLE(INPUT_SPEECH)
+
+#include "SpeechInputClient.h"
+#include "WebSpeechInputListener.h"
+#include <wtf/Forward.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+
+namespace WebCore {
+class SpeechInputListener;
+}
+
+namespace WebKit {
+
+class WebSpeechInputController;
+class WebViewClient;
+
+class SpeechInputClientImpl
+ : public WebCore::SpeechInputClient,
+ public WebSpeechInputListener {
+public:
+ static PassOwnPtr<SpeechInputClientImpl> create(WebViewClient*);
+ virtual ~SpeechInputClientImpl();
+
+ // SpeechInputClient methods.
+ void setListener(WebCore::SpeechInputListener*);
+ bool startRecognition(int requestId, const WebCore::IntRect& elementRect, const AtomicString& language, const String& grammar);
+ void stopRecording(int);
+ void cancelRecognition(int);
+
+ // WebSpeechInputListener methods.
+ void didCompleteRecording(int);
+ void setRecognitionResult(int, const WebSpeechInputResultArray&);
+ void didCompleteRecognition(int);
+
+private:
+ SpeechInputClientImpl(WebViewClient*);
+
+ WebSpeechInputController* m_controller; // To call into the embedder.
+ WebCore::SpeechInputListener* m_listener;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(INPUT_SPEECH)
+
+#endif // SpeechInputClientImpl_h
diff --git a/WebKit/chromium/src/StorageAreaProxy.cpp b/WebKit/chromium/src/StorageAreaProxy.cpp
index c9185fe..5311b65 100644
--- a/WebKit/chromium/src/StorageAreaProxy.cpp
+++ b/WebKit/chromium/src/StorageAreaProxy.cpp
@@ -40,6 +40,7 @@
#include "StorageAreaImpl.h"
#include "StorageEvent.h"
+#include "WebFrameImpl.h"
#include "WebStorageArea.h"
#include "WebString.h"
#include "WebURL.h"
@@ -73,12 +74,13 @@ String StorageAreaProxy::getItem(const String& key) const
String StorageAreaProxy::setItem(const String& key, const String& value, ExceptionCode& ec, Frame* frame)
{
- bool quotaException = false;
+ WebKit::WebStorageArea::Result result = WebKit::WebStorageArea::ResultOK;
WebKit::WebString oldValue;
- m_storageArea->setItem(key, value, frame->document()->url(), quotaException, oldValue);
- ec = quotaException ? QUOTA_EXCEEDED_ERR : 0;
+ WebKit::WebFrame* webFrame = WebKit::WebFrameImpl::fromFrame(frame);
+ m_storageArea->setItem(key, value, frame->document()->url(), result, oldValue, webFrame);
+ ec = (result == WebKit::WebStorageArea::ResultOK) ? 0 : QUOTA_EXCEEDED_ERR;
String oldValueString = oldValue;
- if (oldValueString != value)
+ if (oldValueString != value && result == WebKit::WebStorageArea::ResultOK)
storageEvent(key, oldValue, value, m_storageType, frame->document()->securityOrigin(), frame);
return oldValue;
}
@@ -123,8 +125,12 @@ void StorageAreaProxy::storageEvent(const String& key, const String& oldValue, c
frames.append(frame);
}
- for (unsigned i = 0; i < frames.size(); ++i)
- frames[i]->document()->enqueueStorageEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->url(), frames[i]->domWindow()->sessionStorage()));
+ for (unsigned i = 0; i < frames.size(); ++i) {
+ ExceptionCode ec = 0;
+ Storage* storage = frames[i]->domWindow()->sessionStorage(ec);
+ if (!ec)
+ frames[i]->document()->enqueueEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->url(), storage));
+ }
} else {
// Send events to every page.
const HashSet<Page*>& pages = page->group().pages();
@@ -136,8 +142,12 @@ void StorageAreaProxy::storageEvent(const String& key, const String& oldValue, c
}
}
- for (unsigned i = 0; i < frames.size(); ++i)
- frames[i]->document()->enqueueStorageEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->url(), frames[i]->domWindow()->localStorage()));
+ for (unsigned i = 0; i < frames.size(); ++i) {
+ ExceptionCode ec = 0;
+ Storage* storage = frames[i]->domWindow()->localStorage(ec);
+ if (!ec)
+ frames[i]->document()->enqueueEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->url(), storage));
+ }
}
}
diff --git a/WebKit/chromium/src/StorageEventDispatcherImpl.cpp b/WebKit/chromium/src/StorageEventDispatcherImpl.cpp
index 3518796..631753b 100644
--- a/WebKit/chromium/src/StorageEventDispatcherImpl.cpp
+++ b/WebKit/chromium/src/StorageEventDispatcherImpl.cpp
@@ -71,10 +71,11 @@ void StorageEventDispatcherImpl::dispatchStorageEvent(const String& key, const S
}
}
- // FIXME: Figure out how to pass in the document URI.
for (unsigned i = 0; i < frames.size(); ++i) {
- frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue,
- url, frames[i]->domWindow()->localStorage()));
+ ExceptionCode ec = 0;
+ Storage* storage = frames[i]->domWindow()->localStorage(ec);
+ if (!ec)
+ frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, url, storage));
}
}
diff --git a/WebKit/chromium/src/StorageNamespaceProxy.cpp b/WebKit/chromium/src/StorageNamespaceProxy.cpp
index 1be1967..ec0dbce 100644
--- a/WebKit/chromium/src/StorageNamespaceProxy.cpp
+++ b/WebKit/chromium/src/StorageNamespaceProxy.cpp
@@ -47,11 +47,11 @@ PassRefPtr<StorageNamespace> StorageNamespace::localStorageNamespace(const Strin
return adoptRef(new StorageNamespaceProxy(WebKit::webKitClient()->createLocalStorageNamespace(path, quota), LocalStorage));
}
-PassRefPtr<StorageNamespace> StorageNamespace::sessionStorageNamespace(Page* page)
+PassRefPtr<StorageNamespace> StorageNamespace::sessionStorageNamespace(Page* page, unsigned quota)
{
WebKit::ChromeClientImpl* chromeClientImpl = static_cast<WebKit::ChromeClientImpl*>(page->chrome()->client());
WebKit::WebViewClient* webViewClient = chromeClientImpl->webView()->client();
- return adoptRef(new StorageNamespaceProxy(webViewClient->createSessionStorageNamespace(), SessionStorage));
+ return adoptRef(new StorageNamespaceProxy(webViewClient->createSessionStorageNamespace(quota), SessionStorage));
}
StorageNamespaceProxy::StorageNamespaceProxy(WebKit::WebStorageNamespace* storageNamespace, StorageType storageType)
@@ -67,13 +67,14 @@ StorageNamespaceProxy::~StorageNamespaceProxy()
PassRefPtr<StorageNamespace> StorageNamespaceProxy::copy()
{
ASSERT(m_storageType == SessionStorage);
- // The WebViewClient knows what its session storage namespace id is but we
- // do not. Returning 0 here causes it to be fetched (via the WebViewClient)
- // on its next use. Note that it is WebViewClient::createView's
- // responsibility to clone the session storage namespace id and that the
- // only time copy() is called is directly after the createView call...which
- // is why all of this is safe.
- return 0;
+ WebKit::WebStorageNamespace* newNamespace = m_storageNamespace->copy();
+ // Some embedders hook into WebViewClient::createView to make the copy of
+ // session storage and then return the object lazily. Other embedders
+ // choose to make the copy now and return a pointer immediately. So handle
+ // both cases.
+ if (!newNamespace)
+ return 0;
+ return adoptRef(new StorageNamespaceProxy(newNamespace, m_storageType));
}
PassRefPtr<StorageArea> StorageNamespaceProxy::storageArea(PassRefPtr<SecurityOrigin> origin)
diff --git a/WebKit/chromium/src/SuggestionsPopupMenuClient.cpp b/WebKit/chromium/src/SuggestionsPopupMenuClient.cpp
deleted file mode 100644
index b4a77a3..0000000
--- a/WebKit/chromium/src/SuggestionsPopupMenuClient.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#include "config.h"
-#include "SuggestionsPopupMenuClient.h"
-
-#include "CSSStyleSelector.h"
-#include "CSSValueKeywords.h"
-#include "Chrome.h"
-#include "FrameView.h"
-#include "HTMLInputElement.h"
-#include "RenderTheme.h"
-#include "WebViewImpl.h"
-
-using namespace WebCore;
-
-namespace WebKit {
-
-SuggestionsPopupMenuClient::SuggestionsPopupMenuClient()
- : m_textField(0)
- , m_selectedIndex(0)
-{
-}
-
-SuggestionsPopupMenuClient::~SuggestionsPopupMenuClient()
-{
-}
-
-// FIXME: Implement this per-derived class?
-void SuggestionsPopupMenuClient::valueChanged(unsigned listIndex, bool fireEvents)
-{
- m_textField->setValue(getSuggestion(listIndex));
-
- WebViewImpl* webView = getWebView();
- if (!webView)
- return;
-
- EditorClientImpl* editor =
- static_cast<EditorClientImpl*>(webView->page()->editorClient());
- ASSERT(editor);
- editor->onAutofillSuggestionAccepted(
- static_cast<HTMLInputElement*>(m_textField.get()));
-}
-
-String SuggestionsPopupMenuClient::itemText(unsigned listIndex) const
-{
- return getSuggestion(listIndex);
-}
-
-PopupMenuStyle SuggestionsPopupMenuClient::itemStyle(unsigned listIndex) const
-{
- return *m_style;
-}
-
-PopupMenuStyle SuggestionsPopupMenuClient::menuStyle() const
-{
- return *m_style;
-}
-
-int SuggestionsPopupMenuClient::clientPaddingLeft() const
-{
- // Bug http://crbug.com/7708 seems to indicate the style can be 0.
- RenderStyle* style = textFieldStyle();
- if (!style)
- return 0;
-
- return RenderTheme::defaultTheme()->popupInternalPaddingLeft(style);
-}
-
-int SuggestionsPopupMenuClient::clientPaddingRight() const
-{
- // Bug http://crbug.com/7708 seems to indicate the style can be 0.
- RenderStyle* style = textFieldStyle();
- if (!style)
- return 0;
-
- return RenderTheme::defaultTheme()->popupInternalPaddingRight(style);
-}
-
-void SuggestionsPopupMenuClient::popupDidHide()
-{
- WebViewImpl* webView = getWebView();
- if (webView)
- webView->suggestionsPopupDidHide();
-}
-
-void SuggestionsPopupMenuClient::setTextFromItem(unsigned listIndex)
-{
- m_textField->setValue(getSuggestion(listIndex));
-}
-
-FontSelector* SuggestionsPopupMenuClient::fontSelector() const
-{
- return m_textField->document()->styleSelector()->fontSelector();
-}
-
-HostWindow* SuggestionsPopupMenuClient::hostWindow() const
-{
- return m_textField->document()->view()->hostWindow();
-}
-
-PassRefPtr<Scrollbar> SuggestionsPopupMenuClient::createScrollbar(
- ScrollbarClient* client,
- ScrollbarOrientation orientation,
- ScrollbarControlSize size)
-{
- return Scrollbar::createNativeScrollbar(client, orientation, size);
-}
-
-RenderStyle* SuggestionsPopupMenuClient::textFieldStyle() const
-{
- RenderStyle* style = m_textField->computedStyle();
- if (!style) {
- // It seems we can only have a 0 style in a TextField if the
- // node is detached, in which case we the popup shoud not be
- // showing. Please report this in http://crbug.com/7708 and
- // include the page you were visiting.
- ASSERT_NOT_REACHED();
- }
- return style;
-}
-
-void SuggestionsPopupMenuClient::initialize(HTMLInputElement* textField,
- int defaultSuggestionIndex)
-{
- m_textField = textField;
- m_selectedIndex = defaultSuggestionIndex;
-
- FontDescription fontDescription;
- RenderTheme::defaultTheme()->systemFont(CSSValueWebkitControl,
- fontDescription);
-
- // Use a smaller font size to match IE/Firefox.
- // FIXME: http://crbug.com/7376 use the system size instead of a
- // fixed font size value.
- fontDescription.setComputedSize(12.0);
- Font font(fontDescription, 0, 0);
- font.update(textField->document()->styleSelector()->fontSelector());
- // The direction of text in popup menu is set the same as the direction of
- // the input element: textField.
- m_style.set(new PopupMenuStyle(Color::black, Color::white, font, true,
- Length(WebCore::Fixed),
- textField->renderer()->style()->direction()));
-}
-
-WebViewImpl* SuggestionsPopupMenuClient::getWebView() const
-{
- Frame* frame = m_textField->document()->frame();
- if (!frame)
- return 0;
-
- Page* page = frame->page();
- if (!page)
- return 0;
-
- return static_cast<ChromeClientImpl*>(page->chrome()->client())->webView();
-}
-
-} // namespace WebKit
diff --git a/WebKit/chromium/src/SuggestionsPopupMenuClient.h b/WebKit/chromium/src/SuggestionsPopupMenuClient.h
deleted file mode 100644
index edc4c09..0000000
--- a/WebKit/chromium/src/SuggestionsPopupMenuClient.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#include "PopupMenuClient.h"
-
-#ifndef SuggestionsPopupMenuClient_h
-#define SuggestionsPopupMenuClient_h
-
-namespace WebCore {
-class HTMLInputElement;
-class PopupMenuStyle;
-class RenderStyle;
-}
-
-namespace WebKit {
-class WebString;
-class WebViewImpl;
-template <typename T> class WebVector;
-
-// The Suggestions popup menu client, used to display a list of suggestions.
-class SuggestionsPopupMenuClient : public WebCore::PopupMenuClient {
-public:
- SuggestionsPopupMenuClient();
- virtual ~SuggestionsPopupMenuClient();
-
- // Returns the number of suggestions available.
- virtual unsigned getSuggestionsCount() const = 0;
-
- // Returns the suggestion at |listIndex|.
- virtual WebString getSuggestion(unsigned listIndex) const = 0;
-
- // Removes the suggestion at |listIndex| from the list of suggestions.
- virtual void removeSuggestionAtIndex(unsigned listIndex) = 0;
-
- // WebCore::PopupMenuClient methods:
- virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
- virtual WebCore::String itemText(unsigned listIndex) const;
- virtual WebCore::String itemToolTip(unsigned lastIndex) const { return WebCore::String(); }
- virtual bool itemIsEnabled(unsigned listIndex) const { return true; }
- virtual WebCore::PopupMenuStyle itemStyle(unsigned listIndex) const;
- virtual WebCore::PopupMenuStyle menuStyle() const;
- virtual int clientInsetLeft() const { return 0; }
- virtual int clientInsetRight() const { return 0; }
- virtual int clientPaddingLeft() const;
- virtual int clientPaddingRight() const;
- virtual int listSize() const { return getSuggestionsCount(); }
- virtual int selectedIndex() const { return m_selectedIndex; }
- virtual void popupDidHide();
- virtual bool itemIsSeparator(unsigned listIndex) const { return false; }
- virtual bool itemIsLabel(unsigned listIndex) const { return false; }
- virtual bool itemIsSelected(unsigned listIndex) const { return false; }
- virtual bool shouldPopOver() const { return false; }
- virtual bool valueShouldChangeOnHotTrack() const { return false; }
- virtual void setTextFromItem(unsigned listIndex);
- virtual WebCore::FontSelector* fontSelector() const;
- virtual WebCore::HostWindow* hostWindow() const;
- virtual PassRefPtr<WebCore::Scrollbar> createScrollbar(
- WebCore::ScrollbarClient* client,
- WebCore::ScrollbarOrientation orientation,
- WebCore::ScrollbarControlSize size);
-
-protected:
- void initialize(WebCore::HTMLInputElement* textField,
- int defaultSuggestionIndex);
-
- int getSelectedIndex() const { return m_selectedIndex; }
- void setSelectedIndex(int index) { m_selectedIndex = index; }
-
- WebViewImpl* getWebView() const;
- WebCore::HTMLInputElement* getTextField() const { return m_textField.get(); }
-
-private:
- WebCore::RenderStyle* textFieldStyle() const;
-
- RefPtr<WebCore::HTMLInputElement> m_textField;
- int m_selectedIndex;
- OwnPtr<WebCore::PopupMenuStyle> m_style;
-};
-
-} // namespace WebKit
-
-#endif
diff --git a/WebKit/chromium/src/ToolsAgent.h b/WebKit/chromium/src/ToolsAgent.h
deleted file mode 100644
index ab48153..0000000
--- a/WebKit/chromium/src/ToolsAgent.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#ifndef ToolsAgent_h
-#define ToolsAgent_h
-
-#include "DevToolsRPC.h"
-
-namespace WebKit {
-
-// Tools agent provides API for enabling / disabling other agents as well as
-// API for auxiliary UI functions such as dom elements highlighting.
-#define TOOLS_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \
- /* Dispatches given function on the InspectorController object */ \
- METHOD3(dispatchOnInspectorController, int /* call_id */, \
- String /* function_name */, String /* json_args */) \
- \
- /* Dispatches given function on the InjectedScript object */ \
- METHOD5(dispatchOnInjectedScript, int /* call_id */, \
- int /* injected_script_id */, String /* function_name */, \
- String /* json_args */, bool /* async */)
-
-DEFINE_RPC_CLASS(ToolsAgent, TOOLS_AGENT_STRUCT)
-
-#define TOOLS_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \
- /* Updates focused node on the client. */ \
- METHOD1(frameNavigate, String /* url */) \
- \
- /* Response to the DispatchOn*. */ \
- METHOD3(didDispatchOn, int /* call_id */, String /* result */, String /* exception */) \
- \
- /* Sends InspectorFrontend message to be dispatched on client. */ \
- METHOD1(dispatchOnClient, String /* data */)
-
-DEFINE_RPC_CLASS(ToolsAgentDelegate, TOOLS_AGENT_DELEGATE_STRUCT)
-
-} // namespace WebKit
-
-#endif
diff --git a/WebKit/chromium/src/VideoFrameChromiumImpl.cpp b/WebKit/chromium/src/VideoFrameChromiumImpl.cpp
new file mode 100644
index 0000000..99e3e1e
--- /dev/null
+++ b/WebKit/chromium/src/VideoFrameChromiumImpl.cpp
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "VideoFrameChromiumImpl.h"
+
+#include "VideoFrameChromium.h"
+#include "WebVideoFrame.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebVideoFrame* VideoFrameChromiumImpl::toWebVideoFrame(VideoFrameChromium* videoFrame)
+{
+ VideoFrameChromiumImpl* wrappedFrame = static_cast<VideoFrameChromiumImpl*>(videoFrame);
+ if (wrappedFrame)
+ return wrappedFrame->m_webVideoFrame;
+ return 0;
+}
+
+VideoFrameChromiumImpl::VideoFrameChromiumImpl(WebVideoFrame* webVideoFrame)
+ : m_webVideoFrame(webVideoFrame)
+{
+}
+
+VideoFrameChromium::SurfaceType VideoFrameChromiumImpl::surfaceType() const
+{
+ if (m_webVideoFrame)
+ return static_cast<VideoFrameChromium::SurfaceType>(m_webVideoFrame->surfaceType());
+ return TypeSystemMemory;
+}
+
+VideoFrameChromium::Format VideoFrameChromiumImpl::format() const
+{
+ if (m_webVideoFrame)
+ return static_cast<VideoFrameChromium::Format>(m_webVideoFrame->format());
+ return Invalid;
+}
+
+unsigned VideoFrameChromiumImpl::width() const
+{
+ if (m_webVideoFrame)
+ return m_webVideoFrame->width();
+ return 0;
+}
+
+unsigned VideoFrameChromiumImpl::height() const
+{
+ if (m_webVideoFrame)
+ return m_webVideoFrame->height();
+ return 0;
+}
+
+unsigned VideoFrameChromiumImpl::planes() const
+{
+ if (m_webVideoFrame)
+ return m_webVideoFrame->planes();
+ return 0;
+}
+
+int VideoFrameChromiumImpl::stride(unsigned plane) const
+{
+ if (m_webVideoFrame)
+ return m_webVideoFrame->stride(plane);
+ return 0;
+}
+
+const void* VideoFrameChromiumImpl::data(unsigned plane) const
+{
+ if (m_webVideoFrame)
+ return m_webVideoFrame->data(plane);
+ return 0;
+}
+
+unsigned VideoFrameChromiumImpl::texture(unsigned plane) const
+{
+ if (m_webVideoFrame)
+ return m_webVideoFrame->texture(plane);
+ return 0;
+}
+
+const IntSize VideoFrameChromiumImpl::requiredTextureSize(unsigned plane) const
+{
+ switch (format()) {
+ case RGBA:
+ return IntSize(stride(plane), height());
+ case YV12:
+ if (plane == static_cast<unsigned>(yPlane))
+ return IntSize(stride(plane), height());
+ else if (plane == static_cast<unsigned>(uPlane))
+ return IntSize(stride(plane), height() / 2);
+ else if (plane == static_cast<unsigned>(vPlane))
+ return IntSize(stride(plane), height() / 2);
+ default:
+ break;
+ }
+ return IntSize();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/VideoFrameChromiumImpl.h b/WebKit/chromium/src/VideoFrameChromiumImpl.h
new file mode 100644
index 0000000..f86ee1c
--- /dev/null
+++ b/WebKit/chromium/src/VideoFrameChromiumImpl.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef VideoFrameChromiumImpl_h
+#define VideoFrameChromiumImpl_h
+
+#include "VideoFrameChromium.h"
+#include "WebVideoFrame.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+// A wrapper class for WebKit::WebVideoFrame. Objects can be created in WebKit
+// and used in WebCore because of the VideoFrameChromium interface.
+class VideoFrameChromiumImpl : public VideoFrameChromium {
+public:
+ // Converts a WebCore::VideoFrameChromium to a WebKit::WebVideoFrame.
+ static WebVideoFrame* toWebVideoFrame(VideoFrameChromium*);
+
+ // Creates a VideoFrameChromiumImpl object to wrap the given WebVideoFrame.
+ // The VideoFrameChromiumImpl does not take ownership of the WebVideoFrame
+ // and should not free the frame's memory.
+ VideoFrameChromiumImpl(WebVideoFrame*);
+ virtual SurfaceType surfaceType() const;
+ virtual Format format() const;
+ virtual unsigned width() const;
+ virtual unsigned height() const;
+ virtual unsigned planes() const;
+ virtual int stride(unsigned plane) const;
+ virtual const void* data(unsigned plane) const;
+ virtual unsigned texture(unsigned plane) const;
+ virtual const IntSize requiredTextureSize(unsigned plane) const;
+
+private:
+ WebVideoFrame* m_webVideoFrame;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/WebKit/chromium/src/WebAccessibilityCache.cpp b/WebKit/chromium/src/WebAccessibilityCache.cpp
index 8a3f697..ab8f814 100644
--- a/WebKit/chromium/src/WebAccessibilityCache.cpp
+++ b/WebKit/chromium/src/WebAccessibilityCache.cpp
@@ -42,4 +42,9 @@ void WebAccessibilityCache::enableAccessibility()
AXObjectCache::enableAccessibility();
}
+bool WebAccessibilityCache::accessibilityEnabled()
+{
+ return AXObjectCache::accessibilityEnabled();
+}
+
}
diff --git a/WebKit/chromium/src/WebAccessibilityCacheImpl.cpp b/WebKit/chromium/src/WebAccessibilityCacheImpl.cpp
index 03e5f46..f91bd1c 100644
--- a/WebKit/chromium/src/WebAccessibilityCacheImpl.cpp
+++ b/WebKit/chromium/src/WebAccessibilityCacheImpl.cpp
@@ -63,15 +63,15 @@ WebAccessibilityCache* WebAccessibilityCache::create()
PassRefPtr<WebAccessibilityCacheImpl::WeakHandle> WebAccessibilityCacheImpl::WeakHandle::create(AccessibilityObject* object)
{
- // FIXME: Remove resetting ref-count from AccessibilityObjectWrapper
- // and convert to use adoptRef.
- return new WebAccessibilityCacheImpl::WeakHandle(object);
+ RefPtr<WebAccessibilityCacheImpl::WeakHandle> weakHandle = adoptRef(new WebAccessibilityCacheImpl::WeakHandle(object));
+ weakHandle->m_object->setWrapper(weakHandle.get());
+
+ return weakHandle.release();
}
WebAccessibilityCacheImpl::WeakHandle::WeakHandle(AccessibilityObject* object)
: AccessibilityObjectWrapper(object)
{
- m_object->setWrapper(this);
}
// WebAccessibilityCacheImpl ----------------------------------------
@@ -118,11 +118,6 @@ WebAccessibilityObject WebAccessibilityCacheImpl::getObjectById(int id)
return WebAccessibilityObject(it->second->accessibilityObject());
}
-bool WebAccessibilityCacheImpl::isValidId(int id) const
-{
- return id >= firstObjectId;
-}
-
void WebAccessibilityCacheImpl::remove(int id)
{
ObjectMap::iterator it = m_objectMap.find(id);
@@ -148,7 +143,7 @@ void WebAccessibilityCacheImpl::clear()
int WebAccessibilityCacheImpl::addOrGetId(const WebAccessibilityObject& object)
{
- if (object.isNull())
+ if (!object.isValid())
return invalidObjectId;
RefPtr<AccessibilityObject> o = toAccessibilityObject(object);
@@ -166,4 +161,17 @@ int WebAccessibilityCacheImpl::addOrGetId(const WebAccessibilityObject& object)
return m_nextNewId++;
}
+bool WebAccessibilityCacheImpl::isCached(const WebAccessibilityObject& object)
+{
+ if (!object.isValid())
+ return false;
+
+ RefPtr<AccessibilityObject> o = toAccessibilityObject(object);
+ IdMap::iterator it = m_idMap.find(o.get());
+ if (it == m_idMap.end())
+ return false;
+
+ return true;
+}
+
}
diff --git a/WebKit/chromium/src/WebAccessibilityCacheImpl.h b/WebKit/chromium/src/WebAccessibilityCacheImpl.h
index 5148b74..c72c0fc 100644
--- a/WebKit/chromium/src/WebAccessibilityCacheImpl.h
+++ b/WebKit/chromium/src/WebAccessibilityCacheImpl.h
@@ -45,8 +45,8 @@ public:
virtual bool isInitialized() const { return m_initialized; }
virtual WebAccessibilityObject getObjectById(int);
- virtual bool isValidId(int) const;
virtual int addOrGetId(const WebKit::WebAccessibilityObject&);
+ virtual bool isCached(const WebAccessibilityObject&);
virtual void remove(int);
virtual void clear();
diff --git a/WebKit/chromium/src/WebAccessibilityObject.cpp b/WebKit/chromium/src/WebAccessibilityObject.cpp
index c386d44..9df69cf 100644
--- a/WebKit/chromium/src/WebAccessibilityObject.cpp
+++ b/WebKit/chromium/src/WebAccessibilityObject.cpp
@@ -32,9 +32,15 @@
#include "WebAccessibilityObject.h"
#include "AccessibilityObject.h"
+#include "CSSPrimitiveValueMappings.h"
+#include "Document.h"
#include "EventHandler.h"
#include "FrameView.h"
+#include "Node.h"
#include "PlatformKeyboardEvent.h"
+#include "RenderStyle.h"
+#include "WebDocument.h"
+#include "WebNode.h"
#include "WebPoint.h"
#include "WebRect.h"
#include "WebString.h"
@@ -95,6 +101,15 @@ bool WebAccessibilityObject::canSetValueAttribute() const
return m_private->canSetValueAttribute();
}
+bool WebAccessibilityObject::isValid() const
+{
+ if (!m_private)
+ return false;
+
+ m_private->updateBackingStore();
+ return m_private->axObjectID();
+}
+
unsigned WebAccessibilityObject::childCount() const
{
if (!m_private)
@@ -176,6 +191,15 @@ WebAccessibilityObject WebAccessibilityObject::previousSibling() const
return WebAccessibilityObject(m_private->previousSibling());
}
+bool WebAccessibilityObject::canSetSelectedAttribute() const
+{
+ if (!m_private)
+ return 0;
+
+ m_private->updateBackingStore();
+ return m_private->canSetSelectedAttribute();
+}
+
bool WebAccessibilityObject::isAnchor() const
{
if (!m_private)
@@ -194,6 +218,15 @@ bool WebAccessibilityObject::isChecked() const
return m_private->isChecked();
}
+bool WebAccessibilityObject::isCollapsed() const
+{
+ if (!m_private)
+ return 0;
+
+ m_private->updateBackingStore();
+ return m_private->isCollapsed();
+}
+
bool WebAccessibilityObject::isFocused() const
{
@@ -231,6 +264,15 @@ bool WebAccessibilityObject::isIndeterminate() const
return m_private->isIndeterminate();
}
+bool WebAccessibilityObject::isLinked() const
+{
+ if (!m_private)
+ return 0;
+
+ m_private->updateBackingStore();
+ return m_private->isLinked();
+}
+
bool WebAccessibilityObject::isMultiSelectable() const
{
if (!m_private)
@@ -276,6 +318,24 @@ bool WebAccessibilityObject::isReadOnly() const
return m_private->isReadOnly();
}
+bool WebAccessibilityObject::isSelected() const
+{
+ if (!m_private)
+ return 0;
+
+ m_private->updateBackingStore();
+ return m_private->isSelected();
+}
+
+bool WebAccessibilityObject::isVisible() const
+{
+ if (!m_private)
+ return 0;
+
+ m_private->updateBackingStore();
+ return m_private->isVisible();
+}
+
bool WebAccessibilityObject::isVisited() const
{
if (!m_private)
@@ -291,7 +351,7 @@ WebRect WebAccessibilityObject::boundingBoxRect() const
return WebRect();
m_private->updateBackingStore();
- return m_private->documentFrameView()->contentsToWindow(m_private->boundingBoxRect());
+ return m_private->boundingBoxRect();
}
WebString WebAccessibilityObject::helpText() const
@@ -303,6 +363,15 @@ WebString WebAccessibilityObject::helpText() const
return m_private->helpText();
}
+int WebAccessibilityObject::headingLevel() const
+{
+ if (!m_private)
+ return 0;
+
+ m_private->updateBackingStore();
+ return m_private->headingLevel();
+}
+
WebAccessibilityObject WebAccessibilityObject::hitTest(const WebPoint& point) const
{
if (!m_private)
@@ -368,6 +437,12 @@ WebAccessibilityRole WebAccessibilityObject::roleValue() const
return static_cast<WebAccessibilityRole>(m_private->roleValue());
}
+void WebAccessibilityObject::setFocused(bool on) const
+{
+ if (m_private)
+ m_private->setFocused(on);
+}
+
WebString WebAccessibilityObject::stringValue() const
{
if (!m_private)
@@ -386,6 +461,65 @@ WebString WebAccessibilityObject::title() const
return m_private->title();
}
+
+WebNode WebAccessibilityObject::node() const
+{
+ if (!m_private)
+ return WebNode();
+
+ m_private->updateBackingStore();
+
+ Node* node = m_private->node();
+ if (!node)
+ return WebNode();
+
+ return WebNode(node);
+}
+
+WebDocument WebAccessibilityObject::document() const
+{
+ if (!m_private)
+ return WebDocument();
+
+ m_private->updateBackingStore();
+
+ Document* document = m_private->document();
+ if (!document)
+ return WebDocument();
+
+ return WebDocument(document);
+}
+
+bool WebAccessibilityObject::hasComputedStyle() const
+{
+ Document* document = m_private->document();
+ if (document)
+ document->updateStyleIfNeeded();
+
+ Node* node = m_private->node();
+ if (!node)
+ return false;
+
+ return node->computedStyle();
+}
+
+WebString WebAccessibilityObject::computedStyleDisplay() const
+{
+ Document* document = m_private->document();
+ if (document)
+ document->updateStyleIfNeeded();
+
+ Node* node = m_private->node();
+ if (!node)
+ return WebString();
+
+ RenderStyle* renderStyle = node->computedStyle();
+ if (!renderStyle)
+ return WebString();
+
+ return WebString(CSSPrimitiveValue::create(renderStyle->display())->getStringValue());
+}
+
WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
: m_private(static_cast<WebAccessibilityObjectPrivate*>(object.releaseRef()))
{
diff --git a/WebKit/chromium/src/WebAnimationControllerImpl.cpp b/WebKit/chromium/src/WebAnimationControllerImpl.cpp
index 32a7a61..e6eb828 100644
--- a/WebKit/chromium/src/WebAnimationControllerImpl.cpp
+++ b/WebKit/chromium/src/WebAnimationControllerImpl.cpp
@@ -87,4 +87,24 @@ unsigned WebAnimationControllerImpl::numberOfActiveAnimations() const
return controller->numberOfActiveAnimations();
}
+void WebAnimationControllerImpl::suspendAnimations() const
+{
+ AnimationController* controller = animationController();
+ if (!controller)
+ return;
+ if (!m_frameImpl->frame())
+ return;
+ controller->suspendAnimations();
+}
+
+void WebAnimationControllerImpl::resumeAnimations() const
+{
+ AnimationController* controller = animationController();
+ if (!controller)
+ return;
+ if (!m_frameImpl->frame())
+ return;
+ controller->resumeAnimations();
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebAnimationControllerImpl.h b/WebKit/chromium/src/WebAnimationControllerImpl.h
index 8b0676e..62b89f0 100644
--- a/WebKit/chromium/src/WebAnimationControllerImpl.h
+++ b/WebKit/chromium/src/WebAnimationControllerImpl.h
@@ -31,9 +31,7 @@
#ifndef WebAnimationControllerImpl_h
#define WebAnimationControllerImpl_h
-// FIXME: This relative path is a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebAnimationController.h"
+#include "WebAnimationController.h"
namespace WebCore {
class AnimationController;
@@ -54,6 +52,8 @@ public:
const WebString& propertyName,
double time);
virtual unsigned numberOfActiveAnimations() const;
+ virtual void suspendAnimations() const;
+ virtual void resumeAnimations() const;
private:
WebFrameImpl* m_frameImpl;
WebCore::AnimationController* animationController() const;
diff --git a/WebKit/chromium/src/WebAttribute.cpp b/WebKit/chromium/src/WebAttribute.cpp
new file mode 100644
index 0000000..0bc3b91
--- /dev/null
+++ b/WebKit/chromium/src/WebAttribute.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebAttribute.h"
+
+#include "Attribute.h"
+#include <wtf/PassRefPtr.h>
+
+#include "WebString.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebAttribute::reset()
+{
+ m_private.reset();
+}
+
+void WebAttribute::assign(const WebAttribute& other)
+{
+ m_private = other.m_private;
+}
+
+WebAttribute::WebAttribute(const PassRefPtr<Attribute>& other)
+ : m_private(other)
+{
+}
+
+WebString WebAttribute::localName() const
+{
+ return WebString(m_private->localName());
+}
+
+WebString WebAttribute::value() const
+{
+ return WebString(m_private->value());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebAudioBus.cpp b/WebKit/chromium/src/WebAudioBus.cpp
new file mode 100644
index 0000000..ceccafc
--- /dev/null
+++ b/WebKit/chromium/src/WebAudioBus.cpp
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2010, Google 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.
+ */
+
+#include "config.h"
+#include "WebAudioBus.h"
+
+#if ENABLE(WEB_AUDIO)
+#include "AudioBus.h"
+#else
+namespace WebCore {
+class AudioBus {
+};
+} // namespace WebCore
+#endif
+
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+class WebAudioBusPrivate : public AudioBus {
+};
+
+WebAudioBus::~WebAudioBus()
+{
+#if ENABLE(WEB_AUDIO)
+ delete m_private;
+ m_private = 0;
+#endif
+}
+
+void WebAudioBus::initialize(unsigned numberOfChannels, size_t length, double sampleRate)
+{
+#if ENABLE(WEB_AUDIO)
+ AudioBus* audioBus = new AudioBus(numberOfChannels, length);
+ audioBus->setSampleRate(sampleRate);
+
+ if (m_private)
+ delete m_private;
+ m_private = static_cast<WebAudioBusPrivate*>(audioBus);
+#else
+ ASSERT_NOT_REACHED();
+#endif
+}
+
+unsigned WebAudioBus::numberOfChannels() const
+{
+#if ENABLE(WEB_AUDIO)
+ if (!m_private)
+ return 0;
+ return m_private->numberOfChannels();
+#else
+ ASSERT_NOT_REACHED();
+ return 0;
+#endif
+}
+
+size_t WebAudioBus::length() const
+{
+#if ENABLE(WEB_AUDIO)
+ if (!m_private)
+ return 0;
+ return m_private->length();
+#else
+ ASSERT_NOT_REACHED();
+ return 0;
+#endif
+}
+
+double WebAudioBus::sampleRate() const
+{
+#if ENABLE(WEB_AUDIO)
+ if (!m_private)
+ return 0;
+ return m_private->sampleRate();
+#else
+ ASSERT_NOT_REACHED();
+ return 0;
+#endif
+}
+
+float* WebAudioBus::channelData(unsigned channelIndex)
+{
+#if ENABLE(WEB_AUDIO)
+ if (!m_private)
+ return 0;
+ ASSERT(channelIndex < numberOfChannels());
+ return m_private->channel(channelIndex)->data();
+#else
+ ASSERT_NOT_REACHED();
+ return 0;
+#endif
+}
+
+PassOwnPtr<AudioBus> WebAudioBus::release()
+{
+#if ENABLE(WEB_AUDIO)
+ OwnPtr<AudioBus> audioBus(adoptPtr(static_cast<AudioBus*>(m_private)));
+ m_private = 0;
+ return audioBus.release();
+#else
+ ASSERT_NOT_REACHED();
+ return 0;
+#endif
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebBindings.cpp b/WebKit/chromium/src/WebBindings.cpp
index 04f2f85..0882e38 100644
--- a/WebKit/chromium/src/WebBindings.cpp
+++ b/WebKit/chromium/src/WebBindings.cpp
@@ -34,9 +34,6 @@
#include "npruntime_impl.h"
#include "npruntime_priv.h"
-#include "../public/WebDragData.h"
-#include "../public/WebRange.h"
-
#if USE(V8)
#include "ChromiumDataObject.h"
#include "ClipboardChromium.h"
@@ -46,13 +43,19 @@
#include "Range.h"
#include "V8BindingState.h"
#include "V8DOMWrapper.h"
+#include "V8Element.h"
#include "V8Event.h"
#include "V8Helpers.h"
+#include "V8HiddenPropertyName.h"
+#include "V8NPUtils.h"
#include "V8Proxy.h"
#include "V8Range.h"
#elif USE(JSC)
#include "bridge/c/c_utility.h"
#endif
+#include "WebDragData.h"
+#include "WebElement.h"
+#include "WebRange.h"
#if USE(JAVASCRIPTCORE_BINDINGS)
using JSC::Bindings::PrivateIdentifier;
@@ -208,8 +211,7 @@ void WebBindings::extractIdentifierData(const NPIdentifier& identifier, const NP
static v8::Local<v8::Value> getEvent(const v8::Handle<v8::Context>& context)
{
- static v8::Persistent<v8::String> eventSymbol(v8::Persistent<v8::String>::New(v8::String::NewSymbol("event")));
- return context->Global()->GetHiddenValue(eventSymbol);
+ return context->Global()->GetHiddenValue(V8HiddenPropertyName::event());
}
static bool getDragDataImpl(NPObject* npobj, int* eventId, WebDragData* data)
@@ -284,7 +286,7 @@ static bool getRangeImpl(NPObject* npobj, WebRange* range)
{
V8NPObject* v8npobject = reinterpret_cast<V8NPObject*>(npobj);
v8::Handle<v8::Object> v8object(v8npobject->v8Object);
- if (V8ClassIndex::RANGE != V8DOMWrapper::domWrapperType(v8object))
+ if (!V8Range::info.equals(V8DOMWrapper::domWrapperType(v8object)))
return false;
Range* native = V8Range::toNative(v8object);
@@ -295,6 +297,43 @@ static bool getRangeImpl(NPObject* npobj, WebRange* range)
return true;
}
+static bool getElementImpl(NPObject* npObj, WebElement* webElement)
+{
+ if (!npObj || (npObj->_class != npScriptObjectClass))
+ return false;
+
+ V8NPObject* v8NPObject = reinterpret_cast<V8NPObject*>(npObj);
+ v8::Handle<v8::Object> v8Object(v8NPObject->v8Object);
+ Element* native = V8Element::toNative(v8Object);
+ if (!native)
+ return false;
+
+ *webElement = WebElement(native);
+ return true;
+}
+
+static NPObject* makeIntArrayImpl(const WebVector<int>& data)
+{
+ v8::HandleScope handleScope;
+ v8::Handle<v8::Array> result = v8::Array::New(data.size());
+ for (size_t i = 0; i < data.size(); i++)
+ result->Set(i, v8::Number::New(data[i]));
+
+ WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow(WebCore::V8Proxy::currentContext());
+ return npCreateV8ScriptObject(0, result, window);
+}
+
+static NPObject* makeStringArrayImpl(const WebVector<WebString>& data)
+{
+ v8::HandleScope handleScope;
+ v8::Handle<v8::Array> result = v8::Array::New(data.size());
+ for (size_t i = 0; i < data.size(); ++i)
+ result->Set(i, data[i].data() ? v8::String::New(reinterpret_cast<const uint16_t*>((data[i].data())), data[i].length()) : v8::String::New(""));
+
+ WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow(WebCore::V8Proxy::currentContext());
+ return npCreateV8ScriptObject(0, result, window);
+}
+
#endif
bool WebBindings::getDragData(NPObject* event, int* eventId, WebDragData* data)
@@ -323,4 +362,44 @@ bool WebBindings::getRange(NPObject* range, WebRange* webrange)
#endif
}
+bool WebBindings::getElement(NPObject* element, WebElement* webElement)
+{
+#if USE(V8)
+ return getElementImpl(element, webElement);
+#else
+ // Not supported on other ports (JSC, etc.).
+ return false;
+#endif
+}
+
+NPObject* WebBindings::makeIntArray(const WebVector<int> & data)
+{
+#if USE(V8)
+ return makeIntArrayImpl(data);
+#else
+ // Not supported on other ports (JSC, etc.).
+ return 0;
+#endif
+}
+
+NPObject* WebBindings::makeStringArray(const WebVector<WebString>& data)
+{
+#if USE(V8)
+ return makeStringArrayImpl(data);
+#else
+ // Not supported on other ports (JSC, etc.).
+ return 0;
+#endif
+}
+
+void WebBindings::pushExceptionHandler(ExceptionHandler handler, void* data)
+{
+ WebCore::pushExceptionHandler(handler, data);
+}
+
+void WebBindings::popExceptionHandler()
+{
+ WebCore::popExceptionHandler();
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebBlobData.cpp b/WebKit/chromium/src/WebBlobData.cpp
new file mode 100644
index 0000000..42018dd
--- /dev/null
+++ b/WebKit/chromium/src/WebBlobData.cpp
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebBlobData.h"
+
+#include "BlobData.h"
+#include <wtf/PassOwnPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+class WebBlobDataPrivate : public BlobData {
+};
+
+void WebBlobData::initialize()
+{
+ assign(BlobData::create());
+}
+
+void WebBlobData::reset()
+{
+ assign(0);
+}
+
+size_t WebBlobData::itemCount() const
+{
+ ASSERT(!isNull());
+ return m_private->items().size();
+}
+
+bool WebBlobData::itemAt(size_t index, Item& result) const
+{
+ ASSERT(!isNull());
+
+ if (index >= m_private->items().size())
+ return false;
+
+ const BlobDataItem& item = m_private->items()[index];
+ result.data.reset();
+ result.filePath.reset();
+ result.blobURL = KURL();
+ result.offset = item.offset;
+ result.length = item.length;
+ result.expectedModificationTime = item.expectedModificationTime;
+
+ switch (item.type) {
+ case BlobDataItem::Data:
+ result.type = Item::TypeData;
+ result.data = item.data;
+ return true;
+ case BlobDataItem::File:
+ result.type = Item::TypeFile;
+ result.filePath = item.path;
+ return true;
+ case BlobDataItem::Blob:
+ result.type = Item::TypeBlob;
+ result.blobURL = item.url;
+ return true;
+ }
+ ASSERT_NOT_REACHED();
+ return false;
+}
+
+WebString WebBlobData::contentType() const
+{
+ ASSERT(!isNull());
+ return m_private->contentType();
+}
+
+WebString WebBlobData::contentDisposition() const
+{
+ ASSERT(!isNull());
+ return m_private->contentDisposition();
+}
+
+WebBlobData::WebBlobData(const PassOwnPtr<BlobData>& data)
+ : m_private(0)
+{
+ assign(data);
+}
+
+WebBlobData& WebBlobData::operator=(const PassOwnPtr<BlobData>& data)
+{
+ assign(data);
+ return *this;
+}
+
+WebBlobData::operator PassOwnPtr<BlobData>()
+{
+ WebBlobDataPrivate* temp = m_private;
+ m_private = 0;
+ return adoptPtr(temp);
+}
+
+void WebBlobData::assign(const PassOwnPtr<BlobData>& data)
+{
+ if (m_private)
+ delete m_private;
+ m_private = static_cast<WebBlobDataPrivate*>(data.leakPtr());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebCString.cpp b/WebKit/chromium/src/WebCString.cpp
index 82fbac0..f81d7f4 100644
--- a/WebKit/chromium/src/WebCString.cpp
+++ b/WebKit/chromium/src/WebCString.cpp
@@ -31,16 +31,28 @@
#include "config.h"
#include "WebCString.h"
-#include "CString.h"
#include "TextEncoding.h"
+#include <wtf/text/CString.h>
#include "WebString.h"
namespace WebKit {
-class WebCStringPrivate : public WebCore::CStringBuffer {
+class WebCStringPrivate : public WTF::CStringBuffer {
};
+int WebCString::compare(const WebCString& other) const
+{
+ // A null string is always less than a non null one.
+ if (isNull() != other.isNull())
+ return isNull() ? -1 : 1;
+
+ if (isNull())
+ return 0; // Both WebStrings are null.
+
+ return strcmp(m_private->data(), other.m_private->data());
+}
+
void WebCString::reset()
{
if (m_private) {
@@ -57,8 +69,8 @@ void WebCString::assign(const WebCString& other)
void WebCString::assign(const char* data, size_t length)
{
char* newData;
- RefPtr<WebCore::CStringBuffer> buffer =
- WebCore::CString::newUninitialized(length, newData).buffer();
+ RefPtr<WTF::CStringBuffer> buffer =
+ WTF::CString::newUninitialized(length, newData).buffer();
memcpy(newData, data, length);
assign(static_cast<WebCStringPrivate*>(buffer.get()));
}
@@ -97,20 +109,20 @@ WebCString WebCString::fromUTF16(const WebUChar* data)
return fromUTF16(data, len);
}
-WebCString::WebCString(const WebCore::CString& s)
+WebCString::WebCString(const WTF::CString& s)
: m_private(static_cast<WebCStringPrivate*>(s.buffer()))
{
if (m_private)
m_private->ref();
}
-WebCString& WebCString::operator=(const WebCore::CString& s)
+WebCString& WebCString::operator=(const WTF::CString& s)
{
assign(static_cast<WebCStringPrivate*>(s.buffer()));
return *this;
}
-WebCString::operator WebCore::CString() const
+WebCString::operator WTF::CString() const
{
return m_private;
}
diff --git a/WebKit/chromium/src/WebCache.cpp b/WebKit/chromium/src/WebCache.cpp
index 9d03a4d..2203498 100644
--- a/WebKit/chromium/src/WebCache.cpp
+++ b/WebKit/chromium/src/WebCache.cpp
@@ -31,20 +31,20 @@
#include "config.h"
#include "WebCache.h"
-// Instead of providing accessors, we make all members of Cache public.
-// This will make it easier to track WebCore changes to the Cache class.
-// FIXME: We should introduce public getters on the Cache class.
+// Instead of providing accessors, we make all members of MemoryCache public.
+// This will make it easier to track WebCore changes to the MemoryCache class.
+// FIXME: We should introduce public getters on the MemoryCache class.
#define private public
-#include "Cache.h"
+#include "MemoryCache.h"
#undef private
using namespace WebCore;
namespace WebKit {
-// A helper method for coverting a Cache::TypeStatistic to a
+// A helper method for coverting a MemoryCache::TypeStatistic to a
// WebCache::ResourceTypeStat.
-static void ToResourceTypeStat(const Cache::TypeStatistic& from,
+static void ToResourceTypeStat(const MemoryCache::TypeStatistic& from,
WebCache::ResourceTypeStat& to)
{
to.count = static_cast<size_t>(from.count);
@@ -56,7 +56,7 @@ static void ToResourceTypeStat(const Cache::TypeStatistic& from,
void WebCache::setCapacities(
size_t minDeadCapacity, size_t maxDeadCapacity, size_t capacity)
{
- Cache* cache = WebCore::cache();
+ MemoryCache* cache = WebCore::cache();
if (cache)
cache->setCapacities(static_cast<unsigned int>(minDeadCapacity),
static_cast<unsigned int>(maxDeadCapacity),
@@ -65,17 +65,10 @@ void WebCache::setCapacities(
void WebCache::clear()
{
- Cache* cache = WebCore::cache();
+ MemoryCache* cache = WebCore::cache();
if (cache && !cache->disabled()) {
- // NOTE: I think using setDisabled() instead of setCapacities() will
- // remove from the cache items that won't actually be freed from memory
- // (due to other live references to them), so it just results in wasting
- // time later and not saving memory compared to the below technique.
- unsigned minDeadCapacity = cache->m_minDeadCapacity;
- unsigned maxDeadCapacity = cache->m_maxDeadCapacity;
- unsigned capacity = cache->m_capacity;
- cache->setCapacities(0, 0, 0); // Will prune the cache.
- cache->setCapacities(minDeadCapacity, maxDeadCapacity, capacity);
+ cache->setDisabled(true);
+ cache->setDisabled(false);
}
}
@@ -83,7 +76,7 @@ void WebCache::getUsageStats(UsageStats* result)
{
ASSERT(result);
- Cache* cache = WebCore::cache();
+ MemoryCache* cache = WebCore::cache();
if (cache) {
result->minDeadCapacity = cache->m_minDeadCapacity;
result->maxDeadCapacity = cache->m_maxDeadCapacity;
@@ -96,9 +89,9 @@ void WebCache::getUsageStats(UsageStats* result)
void WebCache::getResourceTypeStats(ResourceTypeStats* result)
{
- Cache* cache = WebCore::cache();
+ MemoryCache* cache = WebCore::cache();
if (cache) {
- Cache::Statistics stats = cache->getStatistics();
+ MemoryCache::Statistics stats = cache->getStatistics();
ToResourceTypeStat(stats.images, result->images);
ToResourceTypeStat(stats.cssStyleSheets, result->cssStyleSheets);
ToResourceTypeStat(stats.scripts, result->scripts);
diff --git a/WebKit/chromium/src/WebCommon.cpp b/WebKit/chromium/src/WebCommon.cpp
new file mode 100644
index 0000000..f9457fb
--- /dev/null
+++ b/WebKit/chromium/src/WebCommon.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebCommon.h"
+
+#include <wtf/Assertions.h>
+
+namespace WebKit {
+
+void failedAssertion(const char* file, int line, const char* function, const char* assertion)
+{
+ WTFReportAssertionFailure(file, line, function, assertion);
+ CRASH();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebEvent.cpp b/WebKit/chromium/src/WebDOMEvent.cpp
index 8c68959..48e5268 100644
--- a/WebKit/chromium/src/WebEvent.cpp
+++ b/WebKit/chromium/src/WebDOMEvent.cpp
@@ -29,7 +29,7 @@
*/
#include "config.h"
-#include "WebEvent.h"
+#include "WebDOMEvent.h"
#include "Event.h"
#include "Node.h"
@@ -37,23 +37,23 @@
namespace WebKit {
-class WebEventPrivate : public WebCore::Event {
+class WebDOMEventPrivate : public WebCore::Event {
};
-void WebEvent::reset()
+void WebDOMEvent::reset()
{
assign(0);
}
-void WebEvent::assign(const WebEvent& other)
+void WebDOMEvent::assign(const WebDOMEvent& other)
{
- WebEventPrivate* p = const_cast<WebEventPrivate*>(other.m_private);
+ WebDOMEventPrivate* p = const_cast<WebDOMEventPrivate*>(other.m_private);
if (p)
p->ref();
assign(p);
}
-void WebEvent::assign(WebEventPrivate* p)
+void WebDOMEvent::assign(WebDOMEventPrivate* p)
{
// p is already ref'd for us by the caller
if (m_private)
@@ -61,156 +61,156 @@ void WebEvent::assign(WebEventPrivate* p)
m_private = p;
}
-WebEvent::WebEvent(const WTF::PassRefPtr<WebCore::Event>& event)
- : m_private(static_cast<WebEventPrivate*>(event.releaseRef()))
+WebDOMEvent::WebDOMEvent(const WTF::PassRefPtr<WebCore::Event>& event)
+ : m_private(static_cast<WebDOMEventPrivate*>(event.releaseRef()))
{
}
-WebString WebEvent::type() const
+WebString WebDOMEvent::type() const
{
ASSERT(m_private);
return m_private->type();
}
-WebNode WebEvent::target() const
+WebNode WebDOMEvent::target() const
{
ASSERT(m_private);
return WebNode(m_private->target()->toNode());
}
-WebNode WebEvent::currentTarget() const
+WebNode WebDOMEvent::currentTarget() const
{
ASSERT(m_private);
return WebNode(m_private->currentTarget()->toNode());
}
-WebEvent::PhaseType WebEvent::eventPhase() const
+WebDOMEvent::PhaseType WebDOMEvent::eventPhase() const
{
ASSERT(m_private);
- return static_cast<WebEvent::PhaseType>(m_private->eventPhase());
+ return static_cast<WebDOMEvent::PhaseType>(m_private->eventPhase());
}
-bool WebEvent::bubbles() const
+bool WebDOMEvent::bubbles() const
{
ASSERT(m_private);
return m_private->bubbles();
}
-bool WebEvent::cancelable() const
+bool WebDOMEvent::cancelable() const
{
ASSERT(m_private);
return m_private->cancelable();
}
-bool WebEvent::isUIEvent() const
+bool WebDOMEvent::isUIEvent() const
{
ASSERT(m_private);
return m_private->isUIEvent();
}
-bool WebEvent::isMouseEvent() const
+bool WebDOMEvent::isMouseEvent() const
{
ASSERT(m_private);
return m_private->isMouseEvent();
}
-bool WebEvent::isMutationEvent() const
+bool WebDOMEvent::isMutationEvent() const
{
ASSERT(m_private);
return m_private->isMutationEvent();
}
-bool WebEvent::isKeyboardEvent() const
+bool WebDOMEvent::isKeyboardEvent() const
{
ASSERT(m_private);
return m_private->isKeyboardEvent();
}
-bool WebEvent::isTextEvent() const
+bool WebDOMEvent::isTextEvent() const
{
ASSERT(m_private);
return m_private->isTextEvent();
}
-bool WebEvent::isCompositionEvent() const
+bool WebDOMEvent::isCompositionEvent() const
{
ASSERT(m_private);
return m_private->isCompositionEvent();
}
-bool WebEvent::isDragEvent() const
+bool WebDOMEvent::isDragEvent() const
{
ASSERT(m_private);
return m_private->isDragEvent();
}
-bool WebEvent::isClipboardEvent() const
+bool WebDOMEvent::isClipboardEvent() const
{
ASSERT(m_private);
return m_private->isClipboardEvent();
}
-bool WebEvent::isMessageEvent() const
+bool WebDOMEvent::isMessageEvent() const
{
ASSERT(m_private);
return m_private->isMessageEvent();
}
-bool WebEvent::isWheelEvent() const
+bool WebDOMEvent::isWheelEvent() const
{
ASSERT(m_private);
return m_private->isWheelEvent();
}
-bool WebEvent::isBeforeTextInsertedEvent() const
+bool WebDOMEvent::isBeforeTextInsertedEvent() const
{
ASSERT(m_private);
return m_private->isBeforeTextInsertedEvent();
}
-bool WebEvent::isOverflowEvent() const
+bool WebDOMEvent::isOverflowEvent() const
{
ASSERT(m_private);
return m_private->isOverflowEvent();
}
-bool WebEvent::isPageTransitionEvent() const
+bool WebDOMEvent::isPageTransitionEvent() const
{
ASSERT(m_private);
return m_private->isPageTransitionEvent();
}
-bool WebEvent::isPopStateEvent() const
+bool WebDOMEvent::isPopStateEvent() const
{
ASSERT(m_private);
return m_private->isPopStateEvent();
}
-bool WebEvent::isProgressEvent() const
+bool WebDOMEvent::isProgressEvent() const
{
ASSERT(m_private);
return m_private->isProgressEvent();
}
-bool WebEvent::isXMLHttpRequestProgressEvent() const
+bool WebDOMEvent::isXMLHttpRequestProgressEvent() const
{
ASSERT(m_private);
return m_private->isXMLHttpRequestProgressEvent();
}
-bool WebEvent::isWebKitAnimationEvent() const
+bool WebDOMEvent::isWebKitAnimationEvent() const
{
ASSERT(m_private);
return m_private->isWebKitAnimationEvent();
}
-bool WebEvent::isWebKitTransitionEvent() const
+bool WebDOMEvent::isWebKitTransitionEvent() const
{
ASSERT(m_private);
return m_private->isWebKitTransitionEvent();
}
-bool WebEvent::isBeforeLoadEvent() const
+bool WebDOMEvent::isBeforeLoadEvent() const
{
ASSERT(m_private);
return m_private->isBeforeLoadEvent();
diff --git a/WebKit/chromium/src/WebEventListener.cpp b/WebKit/chromium/src/WebDOMEventListener.cpp
index 8d9a887..93c1640 100644
--- a/WebKit/chromium/src/WebEventListener.cpp
+++ b/WebKit/chromium/src/WebDOMEventListener.cpp
@@ -1,64 +1,64 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#include "config.h"
-#include "WebEventListener.h"
-
-#include "WebEventListenerPrivate.h"
-
-namespace WebKit {
-
-WebEventListener::WebEventListener()
- : m_private(new WebEventListenerPrivate(this))
-{
-}
-
-WebEventListener::~WebEventListener()
-{
- m_private->webEventListenerDeleted();
- delete m_private;
-}
-
-void WebEventListener::notifyEventListenerDeleted(EventListenerWrapper* wrapper)
-{
- m_private->eventListenerDeleted(wrapper);
-}
-
-EventListenerWrapper* WebEventListener::createEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
-{
- return m_private->createEventListenerWrapper(eventType, useCapture, node);
-}
-
-EventListenerWrapper* WebEventListener::getEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
-{
- return m_private->getEventListenerWrapper(eventType, useCapture, node);
-}
-
-} // namespace WebKit
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebDOMEventListener.h"
+
+#include "WebDOMEventListenerPrivate.h"
+
+namespace WebKit {
+
+WebDOMEventListener::WebDOMEventListener()
+ : m_private(new WebDOMEventListenerPrivate(this))
+{
+}
+
+WebDOMEventListener::~WebDOMEventListener()
+{
+ m_private->webDOMEventListenerDeleted();
+ delete m_private;
+}
+
+void WebDOMEventListener::notifyEventListenerDeleted(EventListenerWrapper* wrapper)
+{
+ m_private->eventListenerDeleted(wrapper);
+}
+
+EventListenerWrapper* WebDOMEventListener::createEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
+{
+ return m_private->createEventListenerWrapper(eventType, useCapture, node);
+}
+
+EventListenerWrapper* WebDOMEventListener::getEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
+{
+ return m_private->getEventListenerWrapper(eventType, useCapture, node);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebEventListenerPrivate.cpp b/WebKit/chromium/src/WebDOMEventListenerPrivate.cpp
index bd14baf..4edbeef 100644
--- a/WebKit/chromium/src/WebEventListenerPrivate.cpp
+++ b/WebKit/chromium/src/WebDOMEventListenerPrivate.cpp
@@ -1,87 +1,87 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#include "config.h"
-#include "WebEventListenerPrivate.h"
-
-#include "EventListenerWrapper.h"
-#include "WebEventListener.h"
-
-namespace WebKit {
-
-WebEventListenerPrivate::WebEventListenerPrivate(WebEventListener* webEventListener)
- : m_webEventListener(webEventListener)
-{
-}
-
-WebEventListenerPrivate::~WebEventListenerPrivate()
-{
-}
-
-EventListenerWrapper* WebEventListenerPrivate::createEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
-{
- EventListenerWrapper* listenerWrapper = new EventListenerWrapper(m_webEventListener);
- WebEventListenerPrivate::ListenerInfo listenerInfo(eventType, useCapture, listenerWrapper, node);
- m_listenerWrappers.append(listenerInfo);
- return listenerWrapper;
-}
-
-EventListenerWrapper* WebEventListenerPrivate::getEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
-{
- Vector<WebEventListenerPrivate::ListenerInfo>::const_iterator iter;
- for (iter = m_listenerWrappers.begin(); iter != m_listenerWrappers.end(); ++iter) {
- if (iter->node == node)
- return iter->eventListenerWrapper;
- }
- ASSERT_NOT_REACHED();
- return 0;
-}
-
-void WebEventListenerPrivate::webEventListenerDeleted()
-{
- // Notifies all WebEventListenerWrappers that we are going away so they can
- // invalidate their pointer to us.
- Vector<WebEventListenerPrivate::ListenerInfo>::const_iterator iter;
- for (iter = m_listenerWrappers.begin(); iter != m_listenerWrappers.end(); ++iter)
- iter->eventListenerWrapper->webEventListenerDeleted();
-}
-
-void WebEventListenerPrivate::eventListenerDeleted(EventListenerWrapper* eventListener)
-{
- for (size_t i = 0; i < m_listenerWrappers.size(); ++i) {
- if (m_listenerWrappers[i].eventListenerWrapper == eventListener) {
- m_listenerWrappers.remove(i);
- return;
- }
- }
- ASSERT_NOT_REACHED();
-}
-
-} // namespace WebKit
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebDOMEventListenerPrivate.h"
+
+#include "EventListenerWrapper.h"
+#include "WebDOMEventListener.h"
+
+namespace WebKit {
+
+WebDOMEventListenerPrivate::WebDOMEventListenerPrivate(WebDOMEventListener* webDOMEventListener)
+ : m_webDOMEventListener(webDOMEventListener)
+{
+}
+
+WebDOMEventListenerPrivate::~WebDOMEventListenerPrivate()
+{
+}
+
+EventListenerWrapper* WebDOMEventListenerPrivate::createEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
+{
+ EventListenerWrapper* listenerWrapper = new EventListenerWrapper(m_webDOMEventListener);
+ WebDOMEventListenerPrivate::ListenerInfo listenerInfo(eventType, useCapture, listenerWrapper, node);
+ m_listenerWrappers.append(listenerInfo);
+ return listenerWrapper;
+}
+
+EventListenerWrapper* WebDOMEventListenerPrivate::getEventListenerWrapper(const WebString& eventType, bool useCapture, Node* node)
+{
+ Vector<WebDOMEventListenerPrivate::ListenerInfo>::const_iterator iter;
+ for (iter = m_listenerWrappers.begin(); iter != m_listenerWrappers.end(); ++iter) {
+ if (iter->node == node)
+ return iter->eventListenerWrapper;
+ }
+ ASSERT_NOT_REACHED();
+ return 0;
+}
+
+void WebDOMEventListenerPrivate::webDOMEventListenerDeleted()
+{
+ // Notifies all WebDOMEventListenerWrappers that we are going away so they can
+ // invalidate their pointer to us.
+ Vector<WebDOMEventListenerPrivate::ListenerInfo>::const_iterator iter;
+ for (iter = m_listenerWrappers.begin(); iter != m_listenerWrappers.end(); ++iter)
+ iter->eventListenerWrapper->webDOMEventListenerDeleted();
+}
+
+void WebDOMEventListenerPrivate::eventListenerDeleted(EventListenerWrapper* eventListener)
+{
+ for (size_t i = 0; i < m_listenerWrappers.size(); ++i) {
+ if (m_listenerWrappers[i].eventListenerWrapper == eventListener) {
+ m_listenerWrappers.remove(i);
+ return;
+ }
+ }
+ ASSERT_NOT_REACHED();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebEventListenerPrivate.h b/WebKit/chromium/src/WebDOMEventListenerPrivate.h
index 0ba2b5d..c86f427 100644
--- a/WebKit/chromium/src/WebEventListenerPrivate.h
+++ b/WebKit/chromium/src/WebDOMEventListenerPrivate.h
@@ -1,95 +1,95 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#ifndef WebEventListenerPrivate_h
-#define WebEventListenerPrivate_h
-
-#include "WebString.h"
-
-#include <wtf/Vector.h>
-
-namespace WebCore {
-class Node;
-}
-
-using namespace WebCore;
-
-namespace WebKit {
-
-class EventListenerWrapper;
-class WebEventListener;
-
-class WebEventListenerPrivate {
-public:
- WebEventListenerPrivate(WebEventListener* webEventListener);
- ~WebEventListenerPrivate();
-
- EventListenerWrapper* createEventListenerWrapper(
- const WebString& eventType, bool useCapture, Node* node);
-
- // Gets the ListenerEventWrapper for a specific node.
- // Used by WebNode::removeEventListener().
- EventListenerWrapper* getEventListenerWrapper(
- const WebString& eventType, bool useCapture, Node* node);
-
- // Called by the WebEventListener when it is about to be deleted.
- void webEventListenerDeleted();
-
- // Called by the EventListenerWrapper when it is about to be deleted.
- void eventListenerDeleted(EventListenerWrapper* eventListener);
-
- struct ListenerInfo {
- ListenerInfo(const WebString& eventType, bool useCapture,
- EventListenerWrapper* eventListenerWrapper,
- Node* node)
- : eventType(eventType)
- , useCapture(useCapture)
- , eventListenerWrapper(eventListenerWrapper)
- , node(node)
- {
- }
-
- WebString eventType;
- bool useCapture;
- EventListenerWrapper* eventListenerWrapper;
- Node* node;
- };
-
-private:
- WebEventListener* m_webEventListener;
-
- // We keep a list of the wrapper for the WebKit EventListener, it is needed
- // to implement WebNode::removeEventListener().
- Vector<ListenerInfo> m_listenerWrappers;
-};
-
-} // namespace WebKit
-
-#endif
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WebDOMEventListenerPrivate_h
+#define WebDOMEventListenerPrivate_h
+
+#include "WebString.h"
+
+#include <wtf/Vector.h>
+
+namespace WebCore {
+class Node;
+}
+
+using namespace WebCore;
+
+namespace WebKit {
+
+class EventListenerWrapper;
+class WebDOMEventListener;
+
+class WebDOMEventListenerPrivate {
+public:
+ WebDOMEventListenerPrivate(WebDOMEventListener* webDOMEventListener);
+ ~WebDOMEventListenerPrivate();
+
+ EventListenerWrapper* createEventListenerWrapper(
+ const WebString& eventType, bool useCapture, Node* node);
+
+ // Gets the ListenerEventWrapper for a specific node.
+ // Used by WebNode::removeDOMEventListener().
+ EventListenerWrapper* getEventListenerWrapper(
+ const WebString& eventType, bool useCapture, Node* node);
+
+ // Called by the WebDOMEventListener when it is about to be deleted.
+ void webDOMEventListenerDeleted();
+
+ // Called by the EventListenerWrapper when it is about to be deleted.
+ void eventListenerDeleted(EventListenerWrapper* eventListener);
+
+ struct ListenerInfo {
+ ListenerInfo(const WebString& eventType, bool useCapture,
+ EventListenerWrapper* eventListenerWrapper,
+ Node* node)
+ : eventType(eventType)
+ , useCapture(useCapture)
+ , eventListenerWrapper(eventListenerWrapper)
+ , node(node)
+ {
+ }
+
+ WebString eventType;
+ bool useCapture;
+ EventListenerWrapper* eventListenerWrapper;
+ Node* node;
+ };
+
+private:
+ WebDOMEventListener* m_webDOMEventListener;
+
+ // We keep a list of the wrapper for the WebKit EventListener, it is needed
+ // to implement WebNode::removeEventListener().
+ Vector<ListenerInfo> m_listenerWrappers;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/WebKit/chromium/src/WebDOMMouseEvent.cpp b/WebKit/chromium/src/WebDOMMouseEvent.cpp
new file mode 100644
index 0000000..bfeae37
--- /dev/null
+++ b/WebKit/chromium/src/WebDOMMouseEvent.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebDOMMouseEvent.h"
+
+#include "MouseEvent.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+int WebDOMMouseEvent::screenX() const
+{
+ return constUnwrap<MouseEvent>()->screenX();
+}
+
+int WebDOMMouseEvent::screenY() const
+{
+ return constUnwrap<MouseEvent>()->screenY();
+}
+
+int WebDOMMouseEvent::clientX() const
+{
+ return constUnwrap<MouseEvent>()->clientX();
+}
+
+int WebDOMMouseEvent::clientY() const
+{
+ return constUnwrap<MouseEvent>()->clientY();
+}
+
+int WebDOMMouseEvent::layerX() const
+{
+ return constUnwrap<MouseEvent>()->layerX();
+}
+
+int WebDOMMouseEvent::layerY() const
+{
+ return constUnwrap<MouseEvent>()->layerY();
+}
+
+int WebDOMMouseEvent::offsetX() const
+{
+ return constUnwrap<MouseEvent>()->offsetX();
+}
+
+int WebDOMMouseEvent::offsetY() const
+{
+ return constUnwrap<MouseEvent>()->offsetY();
+}
+
+int WebDOMMouseEvent::pageX() const
+{
+ return constUnwrap<MouseEvent>()->pageX();
+}
+
+int WebDOMMouseEvent::pageY() const
+{
+ return constUnwrap<MouseEvent>()->pageY();
+}
+
+int WebDOMMouseEvent::x() const
+{
+ return constUnwrap<MouseEvent>()->x();
+}
+
+int WebDOMMouseEvent::y() const
+{
+ return constUnwrap<MouseEvent>()->y();
+}
+
+int WebDOMMouseEvent::button() const
+{
+ return constUnwrap<MouseEvent>()->button();
+}
+
+bool WebDOMMouseEvent::buttonDown() const
+{
+ return constUnwrap<MouseEvent>()->buttonDown();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDOMMutationEvent.cpp b/WebKit/chromium/src/WebDOMMutationEvent.cpp
new file mode 100644
index 0000000..8a6e592
--- /dev/null
+++ b/WebKit/chromium/src/WebDOMMutationEvent.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebDOMMutationEvent.h"
+
+#include "MutationEvent.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebNode WebDOMMutationEvent::relatedNode() const
+{
+ return WebNode(constUnwrap<MutationEvent>()->relatedNode());
+}
+
+WebString WebDOMMutationEvent::prevValue() const
+{
+ return WebString(constUnwrap<MutationEvent>()->prevValue());
+}
+
+WebString WebDOMMutationEvent::newValue() const
+{
+ return WebString(constUnwrap<MutationEvent>()->newValue());
+}
+
+WebString WebDOMMutationEvent::attrName() const
+{
+ return WebString(constUnwrap<MutationEvent>()->attrName());
+}
+
+WebDOMMutationEvent::AttrChangeType WebDOMMutationEvent::attrChange() const
+{
+ return static_cast<AttrChangeType>(constUnwrap<MutationEvent>()->attrChange());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDOMStringList.cpp b/WebKit/chromium/src/WebDOMStringList.cpp
new file mode 100644
index 0000000..dc82331
--- /dev/null
+++ b/WebKit/chromium/src/WebDOMStringList.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebDOMStringList.h"
+
+#include "DOMStringList.h"
+#include "WebString.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebDOMStringList::WebDOMStringList()
+{
+ m_private = WebCore::DOMStringList::create();
+}
+
+void WebDOMStringList::reset()
+{
+ m_private.reset();
+}
+
+void WebDOMStringList::assign(const WebDOMStringList& other)
+{
+ m_private = other.m_private;
+}
+
+void WebDOMStringList::append(const WebString& string)
+{
+ m_private->append(string);
+}
+
+unsigned WebDOMStringList::length() const
+{
+ if (m_private.isNull())
+ return 0;
+ return m_private->length();
+}
+
+WebString WebDOMStringList::item(unsigned index) const
+{
+ return m_private->item(index);
+}
+
+WebDOMStringList::WebDOMStringList(const WTF::PassRefPtr<WebCore::DOMStringList>& item)
+ : m_private(item)
+{
+}
+
+WebDOMStringList& WebDOMStringList::operator=(const WTF::PassRefPtr<WebCore::DOMStringList>& item)
+{
+ m_private = item;
+ return *this;
+}
+
+WebDOMStringList::operator WTF::PassRefPtr<WebCore::DOMStringList>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDataSourceImpl.cpp b/WebKit/chromium/src/WebDataSourceImpl.cpp
index 5a315cf..65147fa 100644
--- a/WebKit/chromium/src/WebDataSourceImpl.cpp
+++ b/WebKit/chromium/src/WebDataSourceImpl.cpp
@@ -96,7 +96,7 @@ double WebDataSourceImpl::triggeringEventTime() const
return 0.0;
// DOMTimeStamp uses units of milliseconds.
- return triggeringAction().event()->timeStamp() / 1000.0;
+ return convertDOMTimeStampToSeconds(triggeringAction().event()->timeStamp());
}
WebDataSource::ExtraData* WebDataSourceImpl::extraData() const
@@ -109,7 +109,8 @@ void WebDataSourceImpl::setExtraData(ExtraData* extraData)
m_extraData.set(extraData);
}
-WebApplicationCacheHost* WebDataSourceImpl::applicationCacheHost() {
+WebApplicationCacheHost* WebDataSourceImpl::applicationCacheHost()
+{
#if ENABLE(OFFLINE_WEB_APPLICATIONS)
return ApplicationCacheHostInternal::toWebApplicationCacheHost(DocumentLoader::applicationCacheHost());
#else
@@ -117,6 +118,11 @@ WebApplicationCacheHost* WebDataSourceImpl::applicationCacheHost() {
#endif
}
+void WebDataSourceImpl::setDeferMainResourceDataLoad(bool defer)
+{
+ DocumentLoader::setDeferMainResourceDataLoad(defer);
+}
+
WebNavigationType WebDataSourceImpl::toWebNavigationType(NavigationType type)
{
switch (type) {
@@ -156,7 +162,7 @@ void WebDataSourceImpl::setNextPluginLoadObserver(PassOwnPtr<WebPluginLoadObserv
{
// This call should always be followed up with the creation of a
// WebDataSourceImpl, so we should never leak this object.
- m_nextPluginLoadObserver = observer.release();
+ m_nextPluginLoadObserver = observer.leakPtr();
}
WebDataSourceImpl::WebDataSourceImpl(const ResourceRequest& request, const SubstituteData& data)
diff --git a/WebKit/chromium/src/WebDataSourceImpl.h b/WebKit/chromium/src/WebDataSourceImpl.h
index f868e95..05329ff 100644
--- a/WebKit/chromium/src/WebDataSourceImpl.h
+++ b/WebKit/chromium/src/WebDataSourceImpl.h
@@ -31,17 +31,12 @@
#ifndef WebDataSourceImpl_h
#define WebDataSourceImpl_h
-// FIXME: This relative path is a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebDataSource.h"
-
#include "DocumentLoader.h"
#include "KURL.h"
-
+#include "WebDataSource.h"
#include "WebPluginLoadObserver.h"
#include "WrappedResourceRequest.h"
#include "WrappedResourceResponse.h"
-
#include <wtf/OwnPtr.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/Vector.h>
@@ -73,6 +68,7 @@ public:
virtual ExtraData* extraData() const;
virtual void setExtraData(ExtraData*);
virtual WebApplicationCacheHost* applicationCacheHost();
+ virtual void setDeferMainResourceDataLoad(bool);
static WebNavigationType toWebNavigationType(WebCore::NavigationType type);
diff --git a/WebKit/chromium/src/WebDatabase.cpp b/WebKit/chromium/src/WebDatabase.cpp
index 50b9220..561d7c4 100644
--- a/WebKit/chromium/src/WebDatabase.cpp
+++ b/WebKit/chromium/src/WebDatabase.cpp
@@ -31,12 +31,8 @@
#include "config.h"
#include "WebDatabase.h"
-#include "Database.h"
-#include "DatabaseTask.h"
-#include "DatabaseThread.h"
+#include "AbstractDatabase.h"
#include "DatabaseTracker.h"
-#include "Document.h"
-#include "KURL.h"
#include "QuotaTracker.h"
#include "SecurityOrigin.h"
#include "WebDatabaseObserver.h"
@@ -44,50 +40,46 @@
#include <wtf/PassRefPtr.h>
#include <wtf/RefPtr.h>
+#if !ENABLE(DATABASE)
+namespace WebCore {
+class AbstractDatabase {
+public:
+ String stringIdentifier() const { return String(); }
+ String displayName() const { return String(); }
+ unsigned long long estimatedSize() const { return 0; }
+ SecurityOrigin* securityOrigin() const { return 0; }
+};
+}
+#endif // !ENABLE(DATABASE)
+
using namespace WebCore;
namespace WebKit {
static WebDatabaseObserver* databaseObserver = 0;
-class WebDatabasePrivate : public Database {
-};
-
-void WebDatabase::reset()
-{
- assign(0);
-}
-
-void WebDatabase::assign(const WebDatabase& other)
-{
- WebDatabasePrivate* d = const_cast<WebDatabasePrivate*>(other.m_private);
- if (d)
- d->ref();
- assign(d);
-}
-
WebString WebDatabase::name() const
{
- ASSERT(m_private);
- return m_private->stringIdentifier();
+ ASSERT(m_database);
+ return m_database->stringIdentifier();
}
WebString WebDatabase::displayName() const
{
- ASSERT(m_private);
- return m_private->displayName();
+ ASSERT(m_database);
+ return m_database->displayName();
}
unsigned long WebDatabase::estimatedSize() const
{
- ASSERT(m_private);
- return m_private->estimatedSize();
+ ASSERT(m_database);
+ return m_database->estimatedSize();
}
WebSecurityOrigin WebDatabase::securityOrigin() const
{
- ASSERT(m_private);
- return WebSecurityOrigin(m_private->securityOrigin());
+ ASSERT(m_database);
+ return WebSecurityOrigin(m_database->securityOrigin());
}
void WebDatabase::setObserver(WebDatabaseObserver* observer)
@@ -104,48 +96,26 @@ void WebDatabase::updateDatabaseSize(
const WebString& originIdentifier, const WebString& databaseName,
unsigned long long databaseSize, unsigned long long spaceAvailable)
{
+#if ENABLE(DATABASE)
WebCore::QuotaTracker::instance().updateDatabaseSizeAndSpaceAvailableToOrigin(
originIdentifier, databaseName, databaseSize, spaceAvailable);
+#endif // ENABLE(DATABASE)
}
void WebDatabase::closeDatabaseImmediately(const WebString& originIdentifier, const WebString& databaseName)
{
- HashSet<RefPtr<Database> > databaseHandles;
- PassRefPtr<SecurityOrigin> originPrp(*WebSecurityOrigin::createFromDatabaseIdentifier(originIdentifier));
- RefPtr<SecurityOrigin> origin = originPrp;
+#if ENABLE(DATABASE)
+ HashSet<RefPtr<AbstractDatabase> > databaseHandles;
+ RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
DatabaseTracker::tracker().getOpenDatabases(origin.get(), databaseName, &databaseHandles);
- for (HashSet<RefPtr<Database> >::iterator it = databaseHandles.begin(); it != databaseHandles.end(); ++it) {
- Database* database = it->get();
- DatabaseThread* databaseThread = database->scriptExecutionContext()->databaseThread();
- if (databaseThread && !databaseThread->terminationRequested()) {
- database->stop();
- databaseThread->scheduleTask(DatabaseCloseTask::create(database, 0));
- }
- }
-}
-
-WebDatabase::WebDatabase(const WTF::PassRefPtr<Database>& database)
- : m_private(static_cast<WebDatabasePrivate*>(database.releaseRef()))
-{
-}
-
-WebDatabase& WebDatabase::operator=(const WTF::PassRefPtr<Database>& database)
-{
- assign(static_cast<WebDatabasePrivate*>(database.releaseRef()));
- return *this;
-}
-
-WebDatabase::operator WTF::PassRefPtr<Database>() const
-{
- return PassRefPtr<Database>(const_cast<WebDatabasePrivate*>(m_private));
+ for (HashSet<RefPtr<AbstractDatabase> >::iterator it = databaseHandles.begin(); it != databaseHandles.end(); ++it)
+ it->get()->closeImmediately();
+#endif // ENABLE(DATABASE)
}
-void WebDatabase::assign(WebDatabasePrivate* d)
+WebDatabase::WebDatabase(const AbstractDatabase* database)
+ : m_database(database)
{
- // d is already ref'd for us by the caller
- if (m_private)
- m_private->deref();
- m_private = d;
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDevToolsAgentImpl.cpp b/WebKit/chromium/src/WebDevToolsAgentImpl.cpp
index 9ce35b4..880adb4 100644
--- a/WebKit/chromium/src/WebDevToolsAgentImpl.cpp
+++ b/WebKit/chromium/src/WebDevToolsAgentImpl.cpp
@@ -31,105 +31,143 @@
#include "config.h"
#include "WebDevToolsAgentImpl.h"
-#include "BoundObject.h"
#include "DebuggerAgentImpl.h"
#include "DebuggerAgentManager.h"
-#include "Document.h"
-#include "EventListener.h"
#include "InjectedScriptHost.h"
-#include "InspectorBackend.h"
+#include "InspectorBackendDispatcher.h"
#include "InspectorController.h"
-#include "InspectorFrontend.h"
-#include "InspectorResource.h"
-#include "Node.h"
#include "Page.h"
+#include "PageGroup.h"
#include "PlatformString.h"
-#include "ProfilerAgentImpl.h"
#include "ResourceError.h"
#include "ResourceRequest.h"
#include "ResourceResponse.h"
-#include "ScriptObject.h"
-#include "ScriptState.h"
-#include "ScriptValue.h"
+#include "ScriptDebugServer.h"
#include "V8Binding.h"
-#include "V8InspectorBackend.h"
#include "V8Proxy.h"
#include "V8Utilities.h"
#include "WebDataSource.h"
#include "WebDevToolsAgentClient.h"
-#include "WebDevToolsMessageData.h"
#include "WebFrameImpl.h"
+#include "WebRect.h"
#include "WebString.h"
#include "WebURL.h"
#include "WebURLError.h"
#include "WebURLRequest.h"
#include "WebURLResponse.h"
+#include "WebViewClient.h"
#include "WebViewImpl.h"
+#include <wtf/CurrentTime.h>
#include <wtf/Noncopyable.h>
#include <wtf/OwnPtr.h>
-using WebCore::Document;
using WebCore::DocumentLoader;
using WebCore::FrameLoader;
using WebCore::InjectedScriptHost;
-using WebCore::InspectorBackend;
+using WebCore::InspectorArray;
+using WebCore::InspectorBackendDispatcher;
using WebCore::InspectorController;
-using WebCore::InspectorFrontend;
-using WebCore::InspectorResource;
using WebCore::Node;
using WebCore::Page;
using WebCore::ResourceError;
using WebCore::ResourceRequest;
using WebCore::ResourceResponse;
-using WebCore::SafeAllocation;
-using WebCore::ScriptObject;
-using WebCore::ScriptState;
-using WebCore::ScriptValue;
-using WebCore::String;
-using WebCore::V8ClassIndex;
+using WTF::String;
using WebCore::V8DOMWrapper;
-using WebCore::V8InspectorBackend;
using WebCore::V8Proxy;
namespace WebKit {
namespace {
-void InspectorBackendWeakReferenceCallback(v8::Persistent<v8::Value> object, void* parameter)
-{
- InspectorBackend* backend = static_cast<InspectorBackend*>(parameter);
- backend->deref();
- object.Dispose();
-}
+static const char kApuAgentFeatureName[] = "apu-agent";
+static const char kFrontendConnectedFeatureName[] = "frontend-connected";
+static const char kInspectorStateFeatureName[] = "inspector-state";
-void SetApuAgentEnabledInUtilityContext(v8::Handle<v8::Context> context, bool enabled)
-{
- v8::HandleScope handleScope;
- v8::Context::Scope contextScope(context);
- v8::Handle<v8::Object> dispatcher = v8::Local<v8::Object>::Cast(
- context->Global()->Get(v8::String::New("ApuAgentDispatcher")));
- if (dispatcher.IsEmpty())
- return;
- dispatcher->Set(v8::String::New("enabled"), v8::Boolean::New(enabled));
-}
+class ClientMessageLoopAdapter : public WebCore::ScriptDebugServer::ClientMessageLoop {
+public:
+ static void ensureClientMessageLoopCreated(WebDevToolsAgentClient* client)
+ {
+ if (s_instance)
+ return;
+ s_instance = new ClientMessageLoopAdapter(client->createClientMessageLoop());
+ WebCore::ScriptDebugServer::shared().setClientMessageLoop(s_instance);
+ }
-// TODO(pfeldman): Make this public in WebDevToolsAgent API.
-static const char kApuAgentFeatureName[] = "apu-agent";
+ static void inspectedViewClosed(WebViewImpl* view)
+ {
+ if (s_instance)
+ s_instance->m_frozenViews.remove(view);
+ }
+
+ static void didNavigate()
+ {
+ // Release render thread if necessary.
+ if (s_instance && s_instance->m_running)
+ WebCore::ScriptDebugServer::shared().continueProgram();
+ }
-// Keep these in sync with the ones in inject_dispatch.js.
-static const char kTimelineFeatureName[] = "timeline-profiler";
-static const char kResourceTrackingFeatureName[] = "resource-tracking";
+private:
+ ClientMessageLoopAdapter(PassOwnPtr<WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop> messageLoop)
+ : m_running(false)
+ , m_messageLoop(messageLoop) { }
-class IORPCDelegate : public DevToolsRPC::Delegate, public Noncopyable {
-public:
- IORPCDelegate() { }
- virtual ~IORPCDelegate() { }
- virtual void sendRpcMessage(const WebDevToolsMessageData& data)
+
+ virtual void run(Page* page)
{
- WebDevToolsAgentClient::sendMessageToFrontendOnIOThread(data);
+ if (m_running)
+ return;
+ m_running = true;
+
+ Vector<WebViewImpl*> views;
+
+ // 1. Disable input events.
+ HashSet<Page*>::const_iterator end = page->group().pages().end();
+ for (HashSet<Page*>::const_iterator it = page->group().pages().begin(); it != end; ++it) {
+ WebViewImpl* view = WebViewImpl::fromPage(*it);
+ m_frozenViews.add(view);
+ views.append(view);
+ view->setIgnoreInputEvents(true);
+ }
+
+ // 2. Disable active objects
+ WebView::willEnterModalLoop();
+
+ // 3. Process messages until quitNow is called.
+ m_messageLoop->run();
+
+ // 4. Resume active objects
+ WebView::didExitModalLoop();
+
+ // 5. Resume input events.
+ for (Vector<WebViewImpl*>::iterator it = views.begin(); it != views.end(); ++it) {
+ if (m_frozenViews.contains(*it)) {
+ // The view was not closed during the dispatch.
+ (*it)->setIgnoreInputEvents(false);
+ }
+ }
+
+ // 6. All views have been resumed, clear the set.
+ m_frozenViews.clear();
+
+ m_running = false;
}
+
+ virtual void quitNow()
+ {
+ m_messageLoop->quitNow();
+ }
+
+ bool m_running;
+ OwnPtr<WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop> m_messageLoop;
+ typedef HashSet<WebViewImpl*> FrozenViewsSet;
+ FrozenViewsSet m_frozenViews;
+ static ClientMessageLoopAdapter* s_instance;
+
};
+ClientMessageLoopAdapter* ClientMessageLoopAdapter::s_instance = 0;
+
} // namespace
WebDevToolsAgentImpl::WebDevToolsAgentImpl(
@@ -139,142 +177,65 @@ WebDevToolsAgentImpl::WebDevToolsAgentImpl(
, m_client(client)
, m_webViewImpl(webViewImpl)
, m_apuAgentEnabled(false)
- , m_resourceTrackingWasEnabled(false)
, m_attached(false)
{
- m_debuggerAgentDelegateStub.set(new DebuggerAgentDelegateStub(this));
- m_toolsAgentDelegateStub.set(new ToolsAgentDelegateStub(this));
- m_apuAgentDelegateStub.set(new ApuAgentDelegateStub(this));
+ DebuggerAgentManager::setExposeV8DebuggerProtocol(
+ client->exposeV8DebuggerProtocol());
}
WebDevToolsAgentImpl::~WebDevToolsAgentImpl()
{
DebuggerAgentManager::onWebViewClosed(m_webViewImpl);
- disposeUtilityContext();
-}
-
-void WebDevToolsAgentImpl::disposeUtilityContext()
-{
- if (!m_utilityContext.IsEmpty()) {
- m_utilityContext.Dispose();
- m_utilityContext.Clear();
- }
-}
-
-void WebDevToolsAgentImpl::unhideResourcesPanelIfNecessary()
-{
- InspectorController* ic = m_webViewImpl->page()->inspectorController();
- ic->ensureResourceTrackingSettingsLoaded();
- String command = String::format("[\"setResourcesPanelEnabled\", %s]",
- ic->resourceTrackingEnabled() ? "true" : "false");
- m_toolsAgentDelegateStub->dispatchOnClient(command);
+ ClientMessageLoopAdapter::inspectedViewClosed(m_webViewImpl);
}
void WebDevToolsAgentImpl::attach()
{
if (m_attached)
return;
- m_debuggerAgentImpl.set(
- new DebuggerAgentImpl(m_webViewImpl,
- m_debuggerAgentDelegateStub.get(),
- this));
- resetInspectorFrontendProxy();
- unhideResourcesPanelIfNecessary();
- // Allow controller to send messages to the frontend.
- InspectorController* ic = inspectorController();
- { // TODO(yurys): the source should have already been pushed by the frontend.
- v8::HandleScope scope;
- v8::Context::Scope contextScope(m_utilityContext);
- v8::Handle<v8::Value> constructorValue = m_utilityContext->Global()->Get(
- v8::String::New("injectedScriptConstructor"));
- if (constructorValue->IsFunction()) {
- String source = WebCore::toWebCoreString(constructorValue);
- ic->injectedScriptHost()->setInjectedScriptSource("(" + source + ")");
- }
- }
+ if (!m_client->exposeV8DebuggerProtocol())
+ ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client);
- ic->setWindowVisible(true, false);
+ m_debuggerAgentImpl.set(
+ new DebuggerAgentImpl(m_webViewImpl, this, m_client));
+ WebCString debuggerScriptJs = m_client->debuggerScriptSource();
+ WebCore::ScriptDebugServer::shared().setDebuggerScriptSource(
+ WTF::String(debuggerScriptJs.data(), debuggerScriptJs.length()));
m_attached = true;
}
void WebDevToolsAgentImpl::detach()
{
// Prevent controller from sending messages to the frontend.
- InspectorController* ic = m_webViewImpl->page()->inspectorController();
+ InspectorController* ic = inspectorController();
+ ic->disconnectFrontend();
ic->hideHighlight();
ic->close();
- disposeUtilityContext();
m_debuggerAgentImpl.set(0);
m_attached = false;
m_apuAgentEnabled = false;
}
-void WebDevToolsAgentImpl::didNavigate()
+void WebDevToolsAgentImpl::frontendLoaded()
{
- DebuggerAgentManager::onNavigate();
+ connectFrontend(false);
}
-void WebDevToolsAgentImpl::didCommitProvisionalLoad(WebFrameImpl* webframe, bool isNewNavigation)
+void WebDevToolsAgentImpl::didNavigate()
{
- if (!m_attached)
- return;
- WebDataSource* ds = webframe->dataSource();
- const WebURLRequest& request = ds->request();
- WebURL url = ds->hasUnreachableURL() ?
- ds->unreachableURL() :
- request.url();
- if (!webframe->parent()) {
- resetInspectorFrontendProxy();
- m_toolsAgentDelegateStub->frameNavigate(WebCore::KURL(url).string());
- SetApuAgentEnabledInUtilityContext(m_utilityContext, m_apuAgentEnabled);
- unhideResourcesPanelIfNecessary();
- }
+ ClientMessageLoopAdapter::didNavigate();
+ DebuggerAgentManager::onNavigate();
}
void WebDevToolsAgentImpl::didClearWindowObject(WebFrameImpl* webframe)
{
DebuggerAgentManager::setHostId(webframe, m_hostId);
- if (m_attached) {
- // Push context id into the client if it is already attached.
- m_debuggerAgentDelegateStub->setContextId(m_hostId);
- }
}
-void WebDevToolsAgentImpl::forceRepaint()
+void WebDevToolsAgentImpl::dispatchOnInspectorBackend(const WebString& message)
{
- m_client->forceRepaint();
-}
-
-void WebDevToolsAgentImpl::dispatchOnInspectorController(int callId, const String& functionName, const String& jsonArgs)
-{
- String result;
- String exception;
- result = m_debuggerAgentImpl->executeUtilityFunction(m_utilityContext, callId,
- "InspectorControllerDispatcher", functionName, jsonArgs, false /* is sync */, &exception);
- m_toolsAgentDelegateStub->didDispatchOn(callId, result, exception);
-}
-
-void WebDevToolsAgentImpl::dispatchOnInjectedScript(int callId, int injectedScriptId, const String& functionName, const String& jsonArgs, bool async)
-{
- inspectorController()->inspectorBackend()->dispatchOnInjectedScript(
- callId,
- injectedScriptId,
- functionName,
- jsonArgs,
- async);
-}
-
-void WebDevToolsAgentImpl::dispatchMessageFromFrontend(const WebDevToolsMessageData& data)
-{
- if (ToolsAgentDispatch::dispatch(this, data))
- return;
-
- if (!m_attached)
- return;
-
- if (m_debuggerAgentImpl.get() && DebuggerAgentDispatch::dispatch(m_debuggerAgentImpl.get(), data))
- return;
+ inspectorController()->inspectorBackendDispatcher()->dispatch(message);
}
void WebDevToolsAgentImpl::inspectElementAt(const WebPoint& point)
@@ -282,188 +243,47 @@ void WebDevToolsAgentImpl::inspectElementAt(const WebPoint& point)
m_webViewImpl->inspectElementAt(point);
}
-void WebDevToolsAgentImpl::setRuntimeFeatureEnabled(const WebString& feature, bool enabled)
-{
- if (feature == kApuAgentFeatureName)
- setApuAgentEnabled(enabled);
- else if (feature == kTimelineFeatureName)
- setTimelineProfilingEnabled(enabled);
- else if (feature == kResourceTrackingFeatureName) {
- InspectorController* ic = m_webViewImpl->page()->inspectorController();
- if (enabled)
- ic->enableResourceTracking(false /* not sticky */, false /* no reload */);
- else
- ic->disableResourceTracking(false /* not sticky */);
- }
-}
-
-void WebDevToolsAgentImpl::sendRpcMessage(const WebDevToolsMessageData& data)
-{
- m_client->sendMessageToFrontend(data);
-}
-
-void WebDevToolsAgentImpl::compileUtilityScripts()
-{
- v8::HandleScope handleScope;
- v8::Context::Scope contextScope(m_utilityContext);
- // Inject javascript into the context.
- WebCString injectedScriptJs = m_client->injectedScriptSource();
- v8::Script::Compile(v8::String::New(
- injectedScriptJs.data(),
- injectedScriptJs.length()))->Run();
- WebCString injectDispatchJs = m_client->injectedScriptDispatcherSource();
- v8::Script::Compile(v8::String::New(
- injectDispatchJs.data(),
- injectDispatchJs.length()))->Run();
-}
-
-void WebDevToolsAgentImpl::initDevToolsAgentHost()
-{
- BoundObject devtoolsAgentHost(m_utilityContext, this, "DevToolsAgentHost");
- devtoolsAgentHost.addProtoFunction(
- "dispatch",
- WebDevToolsAgentImpl::jsDispatchOnClient);
- devtoolsAgentHost.addProtoFunction(
- "dispatchToApu",
- WebDevToolsAgentImpl::jsDispatchToApu);
- devtoolsAgentHost.addProtoFunction(
- "evaluateOnSelf",
- WebDevToolsAgentImpl::jsEvaluateOnSelf);
- devtoolsAgentHost.addProtoFunction(
- "runtimeFeatureStateChanged",
- WebDevToolsAgentImpl::jsOnRuntimeFeatureStateChanged);
- devtoolsAgentHost.build();
-
- v8::HandleScope scope;
- v8::Context::Scope utilityScope(m_utilityContext);
- // Call custom code to create inspector backend wrapper in the utility context
- // instead of calling V8DOMWrapper::convertToV8Object that would create the
- // wrapper in the Page main frame context.
- v8::Handle<v8::Object> backendWrapper = createInspectorBackendV8Wrapper();
- if (backendWrapper.IsEmpty())
- return;
- m_utilityContext->Global()->Set(v8::String::New("InspectorBackend"), backendWrapper);
-}
-
-v8::Local<v8::Object> WebDevToolsAgentImpl::createInspectorBackendV8Wrapper()
+void WebDevToolsAgentImpl::setRuntimeProperty(const WebString& name, const WebString& value)
{
- V8ClassIndex::V8WrapperType descriptorType = V8ClassIndex::INSPECTORBACKEND;
- v8::Handle<v8::Function> function = V8InspectorBackend::GetTemplate()->GetFunction();
- if (function.IsEmpty()) {
- // Return if allocation failed.
- return v8::Local<v8::Object>();
- }
- v8::Local<v8::Object> instance = SafeAllocation::newInstance(function);
- if (instance.IsEmpty()) {
- // Avoid setting the wrapper if allocation failed.
- return v8::Local<v8::Object>();
+ if (name == kApuAgentFeatureName)
+ setApuAgentEnabled(value == "true");
+ else if (name == kInspectorStateFeatureName) {
+ InspectorController* ic = inspectorController();
+ ic->restoreInspectorStateFromCookie(value);
+ } else if (name == kFrontendConnectedFeatureName && !inspectorController()->hasFrontend()) {
+ inspectorController()->injectedScriptHost()->setInjectedScriptSource(value);
+ connectFrontend(true);
}
- InspectorBackend* backend = m_webViewImpl->page()->inspectorController()->inspectorBackend();
- V8DOMWrapper::setDOMWrapper(instance, V8ClassIndex::ToInt(descriptorType), backend);
- // Create a weak reference to the v8 wrapper of InspectorBackend to deref
- // InspectorBackend when the wrapper is garbage collected.
- backend->ref();
- v8::Persistent<v8::Object> weakHandle = v8::Persistent<v8::Object>::New(instance);
- weakHandle.MakeWeak(backend, &InspectorBackendWeakReferenceCallback);
- return instance;
-}
-
-void WebDevToolsAgentImpl::resetInspectorFrontendProxy()
-{
- disposeUtilityContext();
- m_debuggerAgentImpl->createUtilityContext(m_webViewImpl->page()->mainFrame(), &m_utilityContext);
- compileUtilityScripts();
- initDevToolsAgentHost();
-
- v8::HandleScope scope;
- v8::Context::Scope contextScope(m_utilityContext);
- ScriptState* state = ScriptState::forContext(
- v8::Local<v8::Context>::New(m_utilityContext));
- InspectorController* ic = inspectorController();
- ic->setFrontendProxyObject(state, ScriptObject(state, m_utilityContext->Global()));
}
void WebDevToolsAgentImpl::setApuAgentEnabled(bool enabled)
{
m_apuAgentEnabled = enabled;
- SetApuAgentEnabledInUtilityContext(m_utilityContext, enabled);
- InspectorController* ic = m_webViewImpl->page()->inspectorController();
+ InspectorController* ic = inspectorController();
if (enabled) {
- m_resourceTrackingWasEnabled = ic->resourceTrackingEnabled();
+ if (!ic->hasFrontend())
+ connectFrontend(true);
+
ic->startTimelineProfiler();
- if (!m_resourceTrackingWasEnabled) {
- // TODO(knorton): Introduce some kind of agents dependency here so that
- // user could turn off resource tracking while apu agent is on.
- ic->enableResourceTracking(false, false);
- }
m_debuggerAgentImpl->setAutoContinueOnException(true);
- } else {
+ } else
ic->stopTimelineProfiler();
- if (!m_resourceTrackingWasEnabled)
- ic->disableResourceTracking(false);
- m_resourceTrackingWasEnabled = false;
- }
- m_client->runtimeFeatureStateChanged(
- kApuAgentFeatureName,
- enabled);
-}
-
-// static
-v8::Handle<v8::Value> WebDevToolsAgentImpl::jsDispatchOnClient(const v8::Arguments& args)
-{
- v8::TryCatch exceptionCatcher;
- String message = WebCore::toWebCoreStringWithNullCheck(args[0]);
- if (message.isEmpty() || exceptionCatcher.HasCaught())
- return v8::Undefined();
- WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>(v8::External::Cast(*args.Data())->Value());
- agent->m_toolsAgentDelegateStub->dispatchOnClient(message);
- return v8::Undefined();
-}
-
-// static
-v8::Handle<v8::Value> WebDevToolsAgentImpl::jsDispatchToApu(const v8::Arguments& args)
-{
- v8::TryCatch exceptionCatcher;
- String message = WebCore::toWebCoreStringWithNullCheck(args[0]);
- if (message.isEmpty() || exceptionCatcher.HasCaught())
- return v8::Undefined();
- WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>(
- v8::External::Cast(*args.Data())->Value());
- agent->m_apuAgentDelegateStub->dispatchToApu(message);
- return v8::Undefined();
-}
-// static
-v8::Handle<v8::Value> WebDevToolsAgentImpl::jsEvaluateOnSelf(const v8::Arguments& args)
-{
- String code;
- {
- v8::TryCatch exceptionCatcher;
- code = WebCore::toWebCoreStringWithNullCheck(args[0]);
- if (code.isEmpty() || exceptionCatcher.HasCaught())
- return v8::Undefined();
- }
- WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>(v8::External::Cast(*args.Data())->Value());
- v8::Context::Scope(agent->m_utilityContext);
- V8Proxy* proxy = V8Proxy::retrieve(agent->m_webViewImpl->page()->mainFrame());
- v8::Local<v8::Value> result = proxy->runScript(v8::Script::Compile(v8::String::New(code.utf8().data())), true);
- return result;
+ m_client->runtimePropertyChanged(
+ kApuAgentFeatureName,
+ enabled ? String("true") : String("false"));
}
-// static
-v8::Handle<v8::Value> WebDevToolsAgentImpl::jsOnRuntimeFeatureStateChanged(const v8::Arguments& args)
+void WebDevToolsAgentImpl::connectFrontend(bool afterNavigation)
{
- v8::TryCatch exceptionCatcher;
- String feature = WebCore::toWebCoreStringWithNullCheck(args[0]);
- bool enabled = args[1]->ToBoolean()->Value();
- if (feature.isEmpty() || exceptionCatcher.HasCaught())
- return v8::Undefined();
- WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>(v8::External::Cast(*args.Data())->Value());
- agent->m_client->runtimeFeatureStateChanged(feature, enabled);
- return v8::Undefined();
+ if (afterNavigation)
+ inspectorController()->reuseFrontend();
+ else
+ inspectorController()->connectFrontend();
+ // We know that by this time injected script has already been pushed to the backend.
+ m_client->runtimePropertyChanged(kFrontendConnectedFeatureName, inspectorController()->injectedScriptHost()->injectedScriptSource());
}
-
WebCore::InspectorController* WebDevToolsAgentImpl::inspectorController()
{
if (Page* page = m_webViewImpl->page())
@@ -486,10 +306,13 @@ void WebDevToolsAgentImpl::identifierForInitialRequest(
}
}
-void WebDevToolsAgentImpl::willSendRequest(unsigned long resourceId, const WebURLRequest& request)
+void WebDevToolsAgentImpl::willSendRequest(unsigned long resourceId, WebURLRequest& request)
{
- if (InspectorController* ic = inspectorController())
- ic->willSendRequest(resourceId, request.toResourceRequest(), ResourceResponse());
+ if (InspectorController* ic = inspectorController()) {
+ ic->willSendRequest(resourceId, request.toMutableResourceRequest(), ResourceResponse());
+ if (ic->hasFrontend() && request.reportLoadTiming())
+ request.setReportRawHeaders(true);
+ }
}
void WebDevToolsAgentImpl::didReceiveData(unsigned long resourceId, int length)
@@ -501,13 +324,13 @@ void WebDevToolsAgentImpl::didReceiveData(unsigned long resourceId, int length)
void WebDevToolsAgentImpl::didReceiveResponse(unsigned long resourceId, const WebURLResponse& response)
{
if (InspectorController* ic = inspectorController())
- ic->didReceiveResponse(resourceId, response.toResourceResponse());
+ ic->didReceiveResponse(resourceId, 0, response.toResourceResponse());
}
void WebDevToolsAgentImpl::didFinishLoading(unsigned long resourceId)
{
if (InspectorController* ic = inspectorController())
- ic->didFinishLoading(resourceId);
+ ic->didFinishLoading(resourceId, 0);
}
void WebDevToolsAgentImpl::didFailLoading(unsigned long resourceId, const WebURLError& error)
@@ -517,6 +340,67 @@ void WebDevToolsAgentImpl::didFailLoading(unsigned long resourceId, const WebURL
ic->didFailLoading(resourceId, resourceError);
}
+void WebDevToolsAgentImpl::inspectorDestroyed()
+{
+ // Our lifetime is bound to the WebViewImpl.
+}
+
+void WebDevToolsAgentImpl::openInspectorFrontend(InspectorController*)
+{
+}
+
+void WebDevToolsAgentImpl::highlight(Node* node)
+{
+ // InspectorController does the actuall tracking of the highlighted node
+ // and the drawing of the highlight. Here we just make sure to invalidate
+ // the rects of the old and new nodes.
+ hideHighlight();
+}
+
+void WebDevToolsAgentImpl::hideHighlight()
+{
+ // FIXME: able to invalidate a smaller rect.
+ // FIXME: Is it important to just invalidate the rect of the node region
+ // given that this is not on a critical codepath? In order to do so, we'd
+ // have to take scrolling into account.
+ const WebSize& size = m_webViewImpl->size();
+ WebRect damagedRect(0, 0, size.width, size.height);
+ if (m_webViewImpl->client())
+ m_webViewImpl->client()->didInvalidateRect(damagedRect);
+}
+
+void WebDevToolsAgentImpl::populateSetting(const String& key, String* value)
+{
+ WebString string;
+ m_webViewImpl->inspectorSetting(key, &string);
+ *value = string;
+}
+
+void WebDevToolsAgentImpl::storeSetting(const String& key, const String& value)
+{
+ m_webViewImpl->setInspectorSetting(key, value);
+}
+
+bool WebDevToolsAgentImpl::sendMessageToFrontend(const WTF::String& message)
+{
+ WebDevToolsAgentImpl* devToolsAgent = static_cast<WebDevToolsAgentImpl*>(m_webViewImpl->devToolsAgent());
+ if (!devToolsAgent)
+ return false;
+
+ if (devToolsAgent->m_apuAgentEnabled) {
+ m_client->sendDispatchToAPU(message);
+ return true;
+ }
+
+ m_client->sendMessageToInspectorFrontend(message);
+ return true;
+}
+
+void WebDevToolsAgentImpl::updateInspectorStateCookie(const WTF::String& state)
+{
+ m_client->runtimePropertyChanged(kInspectorStateFeatureName, state);
+}
+
void WebDevToolsAgentImpl::evaluateInWebInspector(long callId, const WebString& script)
{
InspectorController* ic = inspectorController();
@@ -532,11 +416,6 @@ void WebDevToolsAgentImpl::setTimelineProfilingEnabled(bool enabled)
ic->stopTimelineProfiler();
}
-WebDevToolsAgent* WebDevToolsAgent::create(WebView* webview, WebDevToolsAgentClient* client)
-{
- return new WebDevToolsAgentImpl(static_cast<WebViewImpl*>(webview), client);
-}
-
void WebDevToolsAgent::executeDebuggerCommand(const WebString& command, int callerId)
{
DebuggerAgentManager::executeDebuggerCommand(command, callerId);
@@ -547,17 +426,46 @@ void WebDevToolsAgent::debuggerPauseScript()
DebuggerAgentManager::pauseScript();
}
-void WebDevToolsAgent::setMessageLoopDispatchHandler(MessageLoopDispatchHandler handler)
+void WebDevToolsAgent::interruptAndDispatch(MessageDescriptor* d)
{
- DebuggerAgentManager::setMessageLoopDispatchHandler(handler);
+ class DebuggerTask : public WebCore::ScriptDebugServer::Task {
+ public:
+ DebuggerTask(WebDevToolsAgent::MessageDescriptor* descriptor) : m_descriptor(descriptor) { }
+ virtual ~DebuggerTask() { }
+ virtual void run()
+ {
+ if (WebDevToolsAgent* webagent = m_descriptor->agent())
+ webagent->dispatchOnInspectorBackend(m_descriptor->message());
+ }
+ private:
+ OwnPtr<WebDevToolsAgent::MessageDescriptor> m_descriptor;
+ };
+ WebCore::ScriptDebugServer::interruptAndRun(new DebuggerTask(d));
}
-bool WebDevToolsAgent::dispatchMessageFromFrontendOnIOThread(const WebDevToolsMessageData& data)
+bool WebDevToolsAgent::shouldInterruptForMessage(const WebString& message)
{
- IORPCDelegate transport;
- ProfilerAgentDelegateStub stub(&transport);
- ProfilerAgentImpl agent(&stub);
- return ProfilerAgentDispatch::dispatch(&agent, data);
+ String commandName;
+ if (!InspectorBackendDispatcher::getCommandName(message, &commandName))
+ return false;
+ return commandName == InspectorBackendDispatcher::pauseCmd
+ || commandName == InspectorBackendDispatcher::setBreakpointCmd
+ || commandName == InspectorBackendDispatcher::removeBreakpointCmd
+ || commandName == InspectorBackendDispatcher::activateBreakpointsCmd
+ || commandName == InspectorBackendDispatcher::deactivateBreakpointsCmd
+ || commandName == InspectorBackendDispatcher::startProfilingCmd
+ || commandName == InspectorBackendDispatcher::stopProfilingCmd
+ || commandName == InspectorBackendDispatcher::getProfileCmd;
+}
+
+void WebDevToolsAgent::processPendingMessages()
+{
+ WebCore::ScriptDebugServer::shared().runPendingTasks();
+}
+
+void WebDevToolsAgent::setMessageLoopDispatchHandler(MessageLoopDispatchHandler handler)
+{
+ DebuggerAgentManager::setMessageLoopDispatchHandler(handler);
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDevToolsAgentImpl.h b/WebKit/chromium/src/WebDevToolsAgentImpl.h
index 1f81c6d..feb4bdd 100644
--- a/WebKit/chromium/src/WebDevToolsAgentImpl.h
+++ b/WebKit/chromium/src/WebDevToolsAgentImpl.h
@@ -31,24 +31,23 @@
#ifndef WebDevToolsAgentImpl_h
#define WebDevToolsAgentImpl_h
-#include "APUAgentDelegate.h"
-#include "DevToolsRPC.h"
-#include "ToolsAgent.h"
+#include "InspectorClient.h"
+
#include "WebDevToolsAgentPrivate.h"
#include <v8.h>
+#include <wtf/Forward.h>
#include <wtf/OwnPtr.h>
namespace WebCore {
class Document;
+class InspectorClient;
class InspectorController;
class Node;
-class String;
}
namespace WebKit {
-class DebuggerAgentDelegateStub;
class DebuggerAgentImpl;
class WebDevToolsAgentClient;
class WebFrame;
@@ -61,79 +60,56 @@ struct WebURLError;
struct WebDevToolsMessageData;
class WebDevToolsAgentImpl : public WebDevToolsAgentPrivate,
- public ToolsAgent,
- public DevToolsRPC::Delegate {
+ public WebCore::InspectorClient {
public:
WebDevToolsAgentImpl(WebViewImpl* webViewImpl, WebDevToolsAgentClient* client);
virtual ~WebDevToolsAgentImpl();
- // ToolsAgent implementation.
- virtual void dispatchOnInspectorController(int callId, const WebCore::String& functionName, const WebCore::String& jsonArgs);
- virtual void dispatchOnInjectedScript(int callId, int injectedScriptId, const WebCore::String& functionName, const WebCore::String& jsonArgs, bool async);
-
// WebDevToolsAgentPrivate implementation.
virtual void didClearWindowObject(WebFrameImpl* frame);
- virtual void didCommitProvisionalLoad(WebFrameImpl* frame, bool isNewNavigation);
// WebDevToolsAgent implementation.
virtual void attach();
virtual void detach();
+ virtual void frontendLoaded();
virtual void didNavigate();
- virtual void dispatchMessageFromFrontend(const WebDevToolsMessageData& data);
+ virtual void dispatchOnInspectorBackend(const WebString& message);
virtual void inspectElementAt(const WebPoint& point);
virtual void evaluateInWebInspector(long callId, const WebString& script);
- virtual void setRuntimeFeatureEnabled(const WebString& feature, bool enabled);
+ virtual void setRuntimeProperty(const WebString& name, const WebString& value);
virtual void setTimelineProfilingEnabled(bool enable);
virtual void identifierForInitialRequest(unsigned long, WebFrame*, const WebURLRequest&);
- virtual void willSendRequest(unsigned long, const WebURLRequest&);
+ virtual void willSendRequest(unsigned long, WebURLRequest&);
virtual void didReceiveData(unsigned long, int length);
virtual void didReceiveResponse(unsigned long, const WebURLResponse&);
virtual void didFinishLoading(unsigned long);
virtual void didFailLoading(unsigned long, const WebURLError&);
- // DevToolsRPC::Delegate implementation.
- virtual void sendRpcMessage(const WebDevToolsMessageData& data);
-
- void forceRepaint();
+ // InspectorClient implementation.
+ virtual void inspectorDestroyed();
+ virtual void openInspectorFrontend(WebCore::InspectorController*);
+ virtual void highlight(WebCore::Node*);
+ virtual void hideHighlight();
+ virtual void populateSetting(const WTF::String& key, WTF::String* value);
+ virtual void storeSetting(const WTF::String& key, const WTF::String& value);
+ virtual void updateInspectorStateCookie(const WTF::String&);
+ virtual bool sendMessageToFrontend(const WTF::String&);
int hostId() { return m_hostId; }
private:
- static v8::Handle<v8::Value> jsDispatchOnClient(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsDispatchToApu(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsEvaluateOnSelf(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsOnRuntimeFeatureStateChanged(const v8::Arguments& args);
-
- void disposeUtilityContext();
- void unhideResourcesPanelIfNecessary();
-
- void compileUtilityScripts();
- void initDevToolsAgentHost();
- void resetInspectorFrontendProxy();
void setApuAgentEnabled(bool enabled);
+ void connectFrontend(bool afterNavigation);
WebCore::InspectorController* inspectorController();
- // Creates InspectorBackend v8 wrapper in the utility context so that it's
- // methods prototype is Function.protoype object from the utility context.
- // Otherwise some useful methods defined on Function.prototype(such as bind)
- // are missing for InspectorController native methods.
- v8::Local<v8::Object> createInspectorBackendV8Wrapper();
-
int m_hostId;
WebDevToolsAgentClient* m_client;
WebViewImpl* m_webViewImpl;
- OwnPtr<DebuggerAgentDelegateStub> m_debuggerAgentDelegateStub;
- OwnPtr<ToolsAgentDelegateStub> m_toolsAgentDelegateStub;
OwnPtr<DebuggerAgentImpl> m_debuggerAgentImpl;
- OwnPtr<ApuAgentDelegateStub> m_apuAgentDelegateStub;
bool m_apuAgentEnabled;
- bool m_resourceTrackingWasEnabled;
bool m_attached;
- // TODO(pfeldman): This should not be needed once GC styles issue is fixed
- // for matching rules.
- v8::Persistent<v8::Context> m_utilityContext;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDevToolsAgentPrivate.h b/WebKit/chromium/src/WebDevToolsAgentPrivate.h
index 0c1c67e..7038a5e 100644
--- a/WebKit/chromium/src/WebDevToolsAgentPrivate.h
+++ b/WebKit/chromium/src/WebDevToolsAgentPrivate.h
@@ -31,9 +31,7 @@
#ifndef WebDevToolsAgentPrivate_h
#define WebDevToolsAgentPrivate_h
-// FIXME: This relative path is a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebDevToolsAgent.h"
+#include "WebDevToolsAgent.h"
namespace WebKit {
class WebFrameImpl;
@@ -45,11 +43,6 @@ public:
// The window object for the frame has been cleared of any extra properties
// that may have been set by script from the previously loaded document.
virtual void didClearWindowObject(WebFrameImpl*) = 0;
-
- // The provisional datasource is now committed. The first part of the
- // response body has been received, and the encoding of the response body
- // is known.
- virtual void didCommitProvisionalLoad(WebFrameImpl*, bool isNewNavigation) = 0;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDevToolsFrontendImpl.cpp b/WebKit/chromium/src/WebDevToolsFrontendImpl.cpp
index 89fa6e7..ea59ab6 100644
--- a/WebKit/chromium/src/WebDevToolsFrontendImpl.cpp
+++ b/WebKit/chromium/src/WebDevToolsFrontendImpl.cpp
@@ -35,25 +35,23 @@
#include "ContextMenuController.h"
#include "ContextMenuItem.h"
#include "DOMWindow.h"
-#include "DebuggerAgent.h"
-#include "DevToolsRPCJS.h"
#include "Document.h"
#include "Event.h"
#include "Frame.h"
#include "InspectorBackend.h"
#include "InspectorController.h"
+#include "InspectorFrontendClientImpl.h"
#include "InspectorFrontendHost.h"
#include "Node.h"
#include "Page.h"
#include "Pasteboard.h"
#include "PlatformString.h"
-#include "ProfilerAgent.h"
#include "SecurityOrigin.h"
#include "Settings.h"
-#include "ToolsAgent.h"
#include "V8Binding.h"
#include "V8DOMWrapper.h"
#include "V8InspectorFrontendHost.h"
+#include "V8MouseEvent.h"
#include "V8Node.h"
#include "V8Proxy.h"
#include "V8Utilities.h"
@@ -76,10 +74,6 @@ static v8::Local<v8::String> ToV8String(const String& s)
return v8::String::New(reinterpret_cast<const uint16_t*>(s.characters()), s.length());
}
-DEFINE_RPC_JS_BOUND_OBJ(DebuggerAgent, DEBUGGER_AGENT_STRUCT, DebuggerAgentDelegate, DEBUGGER_AGENT_DELEGATE_STRUCT)
-DEFINE_RPC_JS_BOUND_OBJ(ProfilerAgent, PROFILER_AGENT_STRUCT, ProfilerAgentDelegate, PROFILER_AGENT_DELEGATE_STRUCT)
-DEFINE_RPC_JS_BOUND_OBJ(ToolsAgent, TOOLS_AGENT_STRUCT, ToolsAgentDelegate, TOOLS_AGENT_DELEGATE_STRUCT)
-
WebDevToolsFrontend* WebDevToolsFrontend::create(
WebView* view,
WebDevToolsFrontendClient* client,
@@ -98,298 +92,40 @@ WebDevToolsFrontendImpl::WebDevToolsFrontendImpl(
: m_webViewImpl(webViewImpl)
, m_client(client)
, m_applicationLocale(applicationLocale)
- , m_loaded(false)
{
- WebFrameImpl* frame = m_webViewImpl->mainFrameImpl();
- v8::HandleScope scope;
- v8::Handle<v8::Context> frameContext = V8Proxy::context(frame->frame());
-
- m_debuggerAgentObj.set(new JSDebuggerAgentBoundObj(this, frameContext, "RemoteDebuggerAgent"));
- m_profilerAgentObj.set(new JSProfilerAgentBoundObj(this, frameContext, "RemoteProfilerAgent"));
- m_toolsAgentObj.set(new JSToolsAgentBoundObj(this, frameContext, "RemoteToolsAgent"));
-
- // Debugger commands should be sent using special method.
- BoundObject debuggerCommandExecutorObj(frameContext, this, "RemoteDebuggerCommandExecutor");
- debuggerCommandExecutorObj.addProtoFunction(
- "DebuggerCommand",
- WebDevToolsFrontendImpl::jsDebuggerCommand);
- debuggerCommandExecutorObj.addProtoFunction(
- "DebuggerPauseScript",
- WebDevToolsFrontendImpl::jsDebuggerPauseScript);
- debuggerCommandExecutorObj.build();
+ InspectorController* ic = m_webViewImpl->page()->inspectorController();
+ ic->setInspectorFrontendClient(new InspectorFrontendClientImpl(m_webViewImpl->page(), m_client, this));
- BoundObject devToolsHost(frameContext, this, "InspectorFrontendHost");
- devToolsHost.addProtoFunction(
- "loaded",
- WebDevToolsFrontendImpl::jsLoaded);
- devToolsHost.addProtoFunction(
- "platform",
- WebDevToolsFrontendImpl::jsPlatform);
- devToolsHost.addProtoFunction(
- "port",
- WebDevToolsFrontendImpl::jsPort);
- devToolsHost.addProtoFunction(
- "copyText",
- WebDevToolsFrontendImpl::jsCopyText);
- devToolsHost.addProtoFunction(
- "activateWindow",
- WebDevToolsFrontendImpl::jsActivateWindow);
- devToolsHost.addProtoFunction(
- "closeWindow",
- WebDevToolsFrontendImpl::jsCloseWindow);
- devToolsHost.addProtoFunction(
- "attach",
- WebDevToolsFrontendImpl::jsDockWindow);
- devToolsHost.addProtoFunction(
- "detach",
- WebDevToolsFrontendImpl::jsUndockWindow);
- devToolsHost.addProtoFunction(
- "localizedStringsURL",
- WebDevToolsFrontendImpl::jsLocalizedStringsURL);
- devToolsHost.addProtoFunction(
- "hiddenPanels",
- WebDevToolsFrontendImpl::jsHiddenPanels);
- devToolsHost.addProtoFunction(
- "setting",
- WebDevToolsFrontendImpl::jsSetting);
- devToolsHost.addProtoFunction(
- "setSetting",
- WebDevToolsFrontendImpl::jsSetSetting);
- devToolsHost.addProtoFunction(
- "windowUnloading",
- WebDevToolsFrontendImpl::jsWindowUnloading);
- devToolsHost.addProtoFunction(
- "showContextMenu",
- WebDevToolsFrontendImpl::jsShowContextMenu);
- devToolsHost.build();
+ // Put each DevTools frontend Page into its own (single page) group so that it's not
+ // deferred along with the inspected page.
+ m_webViewImpl->page()->setGroupName(String());
}
WebDevToolsFrontendImpl::~WebDevToolsFrontendImpl()
{
- if (m_menuProvider)
- m_menuProvider->disconnect();
}
-void WebDevToolsFrontendImpl::dispatchMessageFromAgent(const WebDevToolsMessageData& data)
-{
- Vector<String> v;
- v.append(data.className);
- v.append(data.methodName);
- for (size_t i = 0; i < data.arguments.size(); i++)
- v.append(data.arguments[i]);
- if (!m_loaded) {
- m_pendingIncomingMessages.append(v);
- return;
- }
- executeScript(v);
-}
-
-void WebDevToolsFrontendImpl::executeScript(const Vector<String>& v)
+void WebDevToolsFrontendImpl::dispatchOnInspectorFrontend(const WebString& message)
{
WebFrameImpl* frame = m_webViewImpl->mainFrameImpl();
v8::HandleScope scope;
v8::Handle<v8::Context> frameContext = V8Proxy::context(frame->frame());
v8::Context::Scope contextScope(frameContext);
- v8::Handle<v8::Value> dispatchFunction = frameContext->Global()->Get(v8::String::New("devtools$$dispatch"));
- ASSERT(dispatchFunction->IsFunction());
+ v8::Handle<v8::Value> dispatchFunction = frameContext->Global()->Get(v8::String::New("WebInspector_syncDispatch"));
+ // The frame might have navigated away from the front-end page (which is still weird).
+ if (!dispatchFunction->IsFunction())
+ return;
v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(dispatchFunction);
Vector< v8::Handle<v8::Value> > args;
- for (size_t i = 0; i < v.size(); i++)
- args.append(ToV8String(v.at(i)));
+ args.append(ToV8String(message));
+ v8::TryCatch tryCatch;
+ tryCatch.SetVerbose(true);
function->Call(frameContext->Global(), args.size(), args.data());
}
-void WebDevToolsFrontendImpl::dispatchOnWebInspector(const String& methodName, const String& param)
-{
- WebFrameImpl* frame = m_webViewImpl->mainFrameImpl();
- v8::HandleScope scope;
- v8::Handle<v8::Context> frameContext = V8Proxy::context(frame->frame());
- v8::Context::Scope contextScope(frameContext);
-
- v8::Handle<v8::Value> webInspector = frameContext->Global()->Get(v8::String::New("WebInspector"));
- ASSERT(webInspector->IsObject());
- v8::Handle<v8::Object> webInspectorObj = v8::Handle<v8::Object>::Cast(webInspector);
-
- v8::Handle<v8::Value> method = webInspectorObj->Get(ToV8String(methodName));
- ASSERT(method->IsFunction());
- v8::Handle<v8::Function> methodFunc = v8::Handle<v8::Function>::Cast(method);
- v8::Handle<v8::Value> args[] = {
- ToV8String(param)
- };
- methodFunc->Call(frameContext->Global(), 1, args);
-}
-
-void WebDevToolsFrontendImpl::sendRpcMessage(const WebDevToolsMessageData& data)
-{
- m_client->sendMessageToAgent(data);
-}
-
-void WebDevToolsFrontendImpl::contextMenuItemSelected(ContextMenuItem* item)
-{
- int itemNumber = item->action() - ContextMenuItemBaseCustomTag;
- dispatchOnWebInspector("contextMenuItemSelected", String::number(itemNumber));
-}
-
-void WebDevToolsFrontendImpl::contextMenuCleared()
-{
- dispatchOnWebInspector("contextMenuCleared", "");
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsLoaded(const v8::Arguments& args)
-{
- WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value());
- frontend->m_loaded = true;
-
- // Grant the devtools page the ability to have source view iframes.
- Page* page = V8Proxy::retrieveFrameForEnteredContext()->page();
- SecurityOrigin* origin = page->mainFrame()->domWindow()->securityOrigin();
- origin->grantUniversalAccess();
-
- for (Vector<Vector<String> >::iterator it = frontend->m_pendingIncomingMessages.begin();
- it != frontend->m_pendingIncomingMessages.end();
- ++it) {
- frontend->executeScript(*it);
- }
- frontend->m_pendingIncomingMessages.clear();
- return v8::Undefined();
-}
-
-// static
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsPlatform(const v8::Arguments& args)
-{
-#if defined(OS_MACOSX)
- return v8String("mac");
-#elif defined(OS_LINUX)
- return v8String("linux");
-#elif defined(OS_WIN)
- return v8String("windows");
-#else
- return v8String("unknown");
-#endif
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsPort(const v8::Arguments& args)
-{
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsCopyText(const v8::Arguments& args)
-{
- String text = WebCore::toWebCoreStringWithNullCheck(args[0]);
- Pasteboard::generalPasteboard()->writePlainText(text);
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsActivateWindow(const v8::Arguments& args)
-{
- WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value());
- frontend->m_client->activateWindow();
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsCloseWindow(const v8::Arguments& args)
-{
- WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value());
- frontend->m_client->closeWindow();
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsDockWindow(const v8::Arguments& args)
-{
- WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value());
- frontend->m_client->dockWindow();
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsUndockWindow(const v8::Arguments& args)
-{
- WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value());
- frontend->m_client->undockWindow();
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsLocalizedStringsURL(const v8::Arguments& args)
-{
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsHiddenPanels(const v8::Arguments& args)
-{
- return v8String("");
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsDebuggerCommand(const v8::Arguments& args)
-{
- WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value());
- WebString command = WebCore::toWebCoreStringWithNullCheck(args[0]);
- frontend->m_client->sendDebuggerCommandToAgent(command);
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsSetting(const v8::Arguments& args)
-{
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsSetSetting(const v8::Arguments& args)
+void WebDevToolsFrontendImpl::frontendLoaded()
{
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsDebuggerPauseScript(const v8::Arguments& args)
-{
- WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value());
- frontend->m_client->sendDebuggerPauseScript();
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsWindowUnloading(const v8::Arguments& args)
-{
- // TODO(pfeldman): Implement this.
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsShowContextMenu(const v8::Arguments& args)
-{
- if (args.Length() < 2)
- return v8::Undefined();
-
- v8::Local<v8::Object> eventWrapper = v8::Local<v8::Object>::Cast(args[0]);
- if (V8DOMWrapper::domWrapperType(eventWrapper) != V8ClassIndex::MOUSEEVENT)
- return v8::Undefined();
-
- Event* event = V8Event::toNative(eventWrapper);
- if (!args[1]->IsArray())
- return v8::Undefined();
-
- v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(args[1]);
- Vector<ContextMenuItem*> items;
-
- for (size_t i = 0; i < array->Length(); ++i) {
- v8::Local<v8::Object> item = v8::Local<v8::Object>::Cast(array->Get(v8::Integer::New(i)));
- v8::Local<v8::Value> label = item->Get(v8::String::New("label"));
- v8::Local<v8::Value> id = item->Get(v8::String::New("id"));
- if (label->IsUndefined() || id->IsUndefined()) {
- items.append(new ContextMenuItem(SeparatorType,
- ContextMenuItemTagNoAction,
- String()));
- } else {
- ContextMenuAction typedId = static_cast<ContextMenuAction>(
- ContextMenuItemBaseCustomTag + id->ToInt32()->Value());
- items.append(new ContextMenuItem(ActionType,
- typedId,
- toWebCoreStringWithNullCheck(label)));
- }
- }
-
- WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value());
-
- frontend->m_menuProvider = MenuProvider::create(frontend, items);
-
- ContextMenuController* menuController = frontend->m_webViewImpl->page()->contextMenuController();
- menuController->showContextMenu(event, frontend->m_menuProvider);
-
- return v8::Undefined();
+ m_client->sendFrontendLoaded();
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDevToolsFrontendImpl.h b/WebKit/chromium/src/WebDevToolsFrontendImpl.h
index 62b34da..866a1cb 100644
--- a/WebKit/chromium/src/WebDevToolsFrontendImpl.h
+++ b/WebKit/chromium/src/WebDevToolsFrontendImpl.h
@@ -31,11 +31,10 @@
#ifndef WebDevToolsFrontendImpl_h
#define WebDevToolsFrontendImpl_h
-#include "ContextMenu.h"
-#include "ContextMenuProvider.h"
-#include "DevToolsRPC.h"
+#include "PlatformString.h"
#include "WebDevToolsFrontend.h"
#include <v8.h>
+#include <wtf/Forward.h>
#include <wtf/HashMap.h>
#include <wtf/Noncopyable.h>
#include <wtf/OwnPtr.h>
@@ -46,20 +45,17 @@ namespace WebCore {
class ContextMenuItem;
class Node;
class Page;
-class String;
}
namespace WebKit {
-class JSDebuggerAgentBoundObj;
-class JSProfilerAgentBoundObj;
-class JSToolsAgentBoundObj;
class WebDevToolsClientDelegate;
class WebViewImpl;
struct WebDevToolsMessageData;
+using WTF::String;
+
class WebDevToolsFrontendImpl : public WebKit::WebDevToolsFrontend
- , public DevToolsRPC::Delegate
, public Noncopyable {
public:
WebDevToolsFrontendImpl(
@@ -68,92 +64,15 @@ public:
const String& applicationLocale);
virtual ~WebDevToolsFrontendImpl();
- // DevToolsRPC::Delegate implementation.
- virtual void sendRpcMessage(const WebKit::WebDevToolsMessageData& data);
-
// WebDevToolsFrontend implementation.
- virtual void dispatchMessageFromAgent(const WebKit::WebDevToolsMessageData& data);
-
-private:
- class MenuProvider : public WebCore::ContextMenuProvider {
- public:
- static PassRefPtr<MenuProvider> create(WebDevToolsFrontendImpl* frontendHost, const Vector<WebCore::ContextMenuItem*>& items)
- {
- return adoptRef(new MenuProvider(frontendHost, items));
- }
-
- virtual ~MenuProvider()
- {
- contextMenuCleared();
- }
-
- void disconnect()
- {
- m_frontendHost = 0;
- }
-
- virtual void populateContextMenu(WebCore::ContextMenu* menu)
- {
- for (size_t i = 0; i < m_items.size(); ++i)
- menu->appendItem(*m_items[i]);
- }
+ virtual void dispatchOnInspectorFrontend(const WebString& message);
- virtual void contextMenuItemSelected(WebCore::ContextMenuItem* item)
- {
- if (m_frontendHost)
- m_frontendHost->contextMenuItemSelected(item);
- }
-
- virtual void contextMenuCleared()
- {
- if (m_frontendHost)
- m_frontendHost->contextMenuCleared();
- deleteAllValues(m_items);
- m_items.clear();
- }
-
- private:
- MenuProvider(WebDevToolsFrontendImpl* frontendHost, const Vector<WebCore::ContextMenuItem*>& items)
- : m_frontendHost(frontendHost)
- , m_items(items) { }
- WebDevToolsFrontendImpl* m_frontendHost;
- Vector<WebCore::ContextMenuItem*> m_items;
- };
-
- void executeScript(const Vector<String>& v);
- void dispatchOnWebInspector(const String& method, const String& param);
-
- // friend class MenuSelectionHandler;
- void contextMenuItemSelected(WebCore::ContextMenuItem* menuItem);
- void contextMenuCleared();
-
- static v8::Handle<v8::Value> jsLoaded(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsPlatform(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsPort(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsCopyText(const v8::Arguments& args);
-
- static v8::Handle<v8::Value> jsActivateWindow(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsCloseWindow(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsDockWindow(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsUndockWindow(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsLocalizedStringsURL(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsHiddenPanels(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsDebuggerCommand(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsSetting(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsSetSetting(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsDebuggerPauseScript(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsWindowUnloading(const v8::Arguments& args);
- static v8::Handle<v8::Value> jsShowContextMenu(const v8::Arguments& args);
+ void frontendLoaded();
+private:
WebKit::WebViewImpl* m_webViewImpl;
WebKit::WebDevToolsFrontendClient* m_client;
String m_applicationLocale;
- OwnPtr<JSDebuggerAgentBoundObj> m_debuggerAgentObj;
- OwnPtr<JSProfilerAgentBoundObj> m_profilerAgentObj;
- OwnPtr<JSToolsAgentBoundObj> m_toolsAgentObj;
- bool m_loaded;
- Vector<Vector<String> > m_pendingIncomingMessages;
- RefPtr<MenuProvider> m_menuProvider;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDeviceOrientation.cpp b/WebKit/chromium/src/WebDeviceOrientation.cpp
new file mode 100644
index 0000000..47f6bd1
--- /dev/null
+++ b/WebKit/chromium/src/WebDeviceOrientation.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebDeviceOrientation.h"
+
+#include "DeviceOrientation.h"
+#include <wtf/PassRefPtr.h>
+
+namespace WebKit {
+
+WebDeviceOrientation::WebDeviceOrientation(const PassRefPtr<WebCore::DeviceOrientation>& orientation)
+{
+ if (!orientation) {
+ m_isNull = true;
+ m_canProvideAlpha = false;
+ m_alpha = 0;
+ m_canProvideBeta = false;
+ m_beta = 0;
+ m_canProvideGamma = false;
+ m_gamma = 0;
+ return;
+ }
+
+ m_isNull = false;
+ m_canProvideAlpha = orientation->canProvideAlpha();
+ m_alpha = orientation->alpha();
+ m_canProvideBeta = orientation->canProvideBeta();
+ m_beta = orientation->beta();
+ m_canProvideGamma = orientation->canProvideGamma();
+ m_gamma = orientation->gamma();
+}
+
+WebDeviceOrientation& WebDeviceOrientation::operator=(const PassRefPtr<WebCore::DeviceOrientation>& orientation)
+{
+ if (!orientation) {
+ m_isNull = true;
+ m_canProvideAlpha = false;
+ m_alpha = 0;
+ m_canProvideBeta = false;
+ m_beta = 0;
+ m_canProvideGamma = false;
+ m_gamma = 0;
+ return *this;
+ }
+
+ m_isNull = false;
+ m_canProvideAlpha = orientation->canProvideAlpha();
+ m_alpha = orientation->alpha();
+ m_canProvideBeta = orientation->canProvideBeta();
+ m_beta = orientation->beta();
+ m_canProvideGamma = orientation->canProvideGamma();
+ m_gamma = orientation->gamma();
+ return *this;
+}
+
+WebDeviceOrientation::operator PassRefPtr<WebCore::DeviceOrientation>() const
+{
+ if (m_isNull)
+ return 0;
+ return WebCore::DeviceOrientation::create(m_canProvideAlpha, m_alpha, m_canProvideBeta, m_beta, m_canProvideGamma, m_gamma);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDeviceOrientationClientMock.cpp b/WebKit/chromium/src/WebDeviceOrientationClientMock.cpp
new file mode 100644
index 0000000..8a75ca1
--- /dev/null
+++ b/WebKit/chromium/src/WebDeviceOrientationClientMock.cpp
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebDeviceOrientationClientMock.h"
+
+#include "DeviceOrientationClientMock.h"
+#include "WebDeviceOrientation.h"
+#include "WebDeviceOrientationController.h"
+
+namespace WebKit {
+
+WebDeviceOrientationClientMock* WebDeviceOrientationClientMock::create()
+{
+ return new WebDeviceOrientationClientMock();
+}
+
+void WebDeviceOrientationClientMock::setController(WebDeviceOrientationController* controller)
+{
+ m_clientMock->setController(controller->controller());
+ delete controller;
+}
+
+void WebDeviceOrientationClientMock::startUpdating()
+{
+ m_clientMock->startUpdating();
+}
+
+void WebDeviceOrientationClientMock::stopUpdating()
+{
+ m_clientMock->stopUpdating();
+}
+
+WebDeviceOrientation WebDeviceOrientationClientMock::lastOrientation() const
+{
+ return WebDeviceOrientation(m_clientMock->lastOrientation());
+}
+
+void WebDeviceOrientationClientMock::setOrientation(WebDeviceOrientation& orientation)
+{
+ m_clientMock->setOrientation(orientation);
+}
+
+void WebDeviceOrientationClientMock::initialize()
+{
+ m_clientMock.reset(new WebCore::DeviceOrientationClientMock());
+}
+
+void WebDeviceOrientationClientMock::reset()
+{
+ m_clientMock.reset(0);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDeviceOrientationController.cpp b/WebKit/chromium/src/WebDeviceOrientationController.cpp
new file mode 100644
index 0000000..aa9249f
--- /dev/null
+++ b/WebKit/chromium/src/WebDeviceOrientationController.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebDeviceOrientationController.h"
+
+#include "DeviceOrientation.h"
+#include "DeviceOrientationController.h"
+#include "WebDeviceOrientation.h"
+#include <wtf/PassRefPtr.h>
+
+namespace WebKit {
+
+void WebDeviceOrientationController::didChangeDeviceOrientation(const WebDeviceOrientation& orientation)
+{
+ PassRefPtr<WebCore::DeviceOrientation> deviceOrientation(orientation);
+ m_controller->didChangeDeviceOrientation(deviceOrientation.get());
+}
+
+WebCore::DeviceOrientationController* WebDeviceOrientationController::controller() const
+{
+ return m_controller;
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDocument.cpp b/WebKit/chromium/src/WebDocument.cpp
index 84f3004..a983bf7 100644
--- a/WebKit/chromium/src/WebDocument.cpp
+++ b/WebKit/chromium/src/WebDocument.cpp
@@ -32,7 +32,7 @@
#include "WebDocument.h"
#include "Document.h"
-#include "DocumentLoader.h"
+#include "DocumentType.h"
#include "Element.h"
#include "HTMLAllCollection.h"
#include "HTMLBodyElement.h"
@@ -41,9 +41,11 @@
#include "HTMLHeadElement.h"
#include "NodeList.h"
+#include "WebDocumentType.h"
#include "WebElement.h"
#include "WebFrameImpl.h"
#include "WebNodeCollection.h"
+#include "WebNodeList.h"
#include "WebURL.h"
#include <wtf/PassRefPtr.h>
@@ -52,30 +54,24 @@ using namespace WebCore;
namespace WebKit {
-WebDocument::WebDocument(const PassRefPtr<Document>& elem)
- : WebNode(elem.releaseRef())
-{
-}
-
-WebDocument& WebDocument::operator=(const PassRefPtr<Document>& elem)
+WebFrame* WebDocument::frame() const
{
- WebNode::assign(elem.releaseRef());
- return *this;
+ return WebFrameImpl::fromFrame(constUnwrap<Document>()->frame());
}
-WebDocument::operator PassRefPtr<Document>() const
-{
- return PassRefPtr<Document>(static_cast<Document*>(m_private));
+bool WebDocument::isHTMLDocument() const
+{
+ return constUnwrap<Document>()->isHTMLDocument();
}
-WebFrame* WebDocument::frame() const
+bool WebDocument::isXHTMLDocument() const
{
- return WebFrameImpl::fromFrame(constUnwrap<Document>()->frame());
+ return constUnwrap<Document>()->isXHTMLDocument();
}
-bool WebDocument::isHTMLDocument() const
+bool WebDocument::isPluginDocument() const
{
- return constUnwrap<Document>()->isHTMLDocument();
+ return constUnwrap<Document>()->isPluginDocument();
}
WebURL WebDocument::baseURL() const
@@ -83,6 +79,11 @@ WebURL WebDocument::baseURL() const
return constUnwrap<Document>()->baseURL();
}
+WebURL WebDocument::firstPartyForCookies() const
+{
+ return constUnwrap<Document>()->firstPartyForCookies();
+}
+
WebElement WebDocument::documentElement() const
{
return WebElement(constUnwrap<Document>()->documentElement());
@@ -98,6 +99,11 @@ WebElement WebDocument::head()
return WebElement(unwrap<Document>()->head());
}
+WebString WebDocument::title() const
+{
+ return WebString(constUnwrap<Document>()->title());
+}
+
WebNodeCollection WebDocument::all()
{
return WebNodeCollection(unwrap<Document>()->all());
@@ -113,38 +119,30 @@ WebElement WebDocument::getElementById(const WebString& id) const
return WebElement(constUnwrap<Document>()->getElementById(id));
}
-WebString WebDocument::applicationID() const
+WebNode WebDocument::focusedNode() const
{
- const char* kChromeApplicationHeader = "x-chrome-application";
-
- // First check if the document's response included a header indicating the
- // application it should go with.
- const Document* document = constUnwrap<Document>();
- Frame* frame = document->frame();
- if (!frame)
- return WebString();
+ return WebNode(constUnwrap<Document>()->focusedNode());
+}
- DocumentLoader* loader = frame->loader()->documentLoader();
- if (!loader)
- return WebString();
+WebDocumentType WebDocument::doctype() const
+{
+ return WebDocumentType(constUnwrap<Document>()->doctype());
+}
- WebString headerValue =
- loader->response().httpHeaderField(kChromeApplicationHeader);
- if (!headerValue.isEmpty())
- return headerValue;
+WebDocument::WebDocument(const PassRefPtr<Document>& elem)
+ : WebNode(elem)
+{
+}
- // Otherwise, fall back to looking for the meta tag.
- RefPtr<NodeList> metaTags =
- const_cast<Document*>(document)->getElementsByTagName("meta");
- for (unsigned i = 0; i < metaTags->length(); ++i) {
- Element* element = static_cast<Element*>(metaTags->item(i));
- if (element->getAttribute("http-equiv").lower() ==
- kChromeApplicationHeader) {
- return element->getAttribute("value");
- }
- }
+WebDocument& WebDocument::operator=(const PassRefPtr<Document>& elem)
+{
+ m_private = elem;
+ return *this;
+}
- return WebString();
+WebDocument::operator PassRefPtr<Document>() const
+{
+ return static_cast<Document*>(m_private.get());
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDocumentType.cpp b/WebKit/chromium/src/WebDocumentType.cpp
new file mode 100644
index 0000000..bbf28e7
--- /dev/null
+++ b/WebKit/chromium/src/WebDocumentType.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebDocumentType.h"
+
+#include "DocumentType.h"
+#include "WebString.h"
+
+#include <wtf/PassRefPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebString WebDocumentType::name() const
+{
+ return WebString(constUnwrap<DocumentType>()->name());
+}
+
+WebDocumentType::WebDocumentType(const PassRefPtr<DocumentType>& elem)
+ : WebNode(elem)
+{
+}
+
+WebDocumentType& WebDocumentType::operator=(const PassRefPtr<DocumentType>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebDocumentType::operator PassRefPtr<DocumentType>() const
+{
+ return static_cast<DocumentType*>(m_private.get());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebDragData.cpp b/WebKit/chromium/src/WebDragData.cpp
index b18ab1b..9167c69 100644
--- a/WebKit/chromium/src/WebDragData.cpp
+++ b/WebKit/chromium/src/WebDragData.cpp
@@ -32,6 +32,8 @@
#include "WebDragData.h"
#include "ChromiumDataObject.h"
+#include "ChromiumDataObjectLegacy.h"
+#include "ClipboardMimeTypes.h"
#include "WebData.h"
#include "WebString.h"
#include "WebURL.h"
@@ -48,7 +50,7 @@ class WebDragDataPrivate : public ChromiumDataObject {
void WebDragData::initialize()
{
- assign(static_cast<WebDragDataPrivate*>(ChromiumDataObject::create().releaseRef()));
+ assign(static_cast<WebDragDataPrivate*>(ChromiumDataObject::create(ChromiumDataObjectLegacy::create(Clipboard::DragAndDrop)).releaseRef()));
}
void WebDragData::reset()
@@ -64,149 +66,144 @@ void WebDragData::assign(const WebDragData& other)
assign(p);
}
-WebURL WebDragData::url() const
+WebString WebDragData::url() const
{
ASSERT(!isNull());
- return m_private->url;
+ bool ignoredSuccess;
+ return m_private->getData(mimeTypeURL, ignoredSuccess);
}
void WebDragData::setURL(const WebURL& url)
{
ensureMutable();
- m_private->url = url;
+ m_private->setData(mimeTypeURL, KURL(url).string());
}
WebString WebDragData::urlTitle() const
{
ASSERT(!isNull());
- return m_private->urlTitle;
+ return m_private->urlTitle();
}
void WebDragData::setURLTitle(const WebString& urlTitle)
{
ensureMutable();
- m_private->urlTitle = urlTitle;
-}
-
-WebURL WebDragData::downloadURL() const
-{
- ASSERT(!isNull());
- return m_private->downloadURL;
-}
-
-void WebDragData::setDownloadURL(const WebURL& downloadURL)
-{
- ensureMutable();
- m_private->downloadURL = downloadURL;
+ m_private->setUrlTitle(urlTitle);
}
WebString WebDragData::downloadMetadata() const
{
ASSERT(!isNull());
- return m_private->downloadMetadata;
+ bool ignoredSuccess;
+ return m_private->getData(mimeTypeDownloadURL, ignoredSuccess);
}
void WebDragData::setDownloadMetadata(const WebString& downloadMetadata)
{
ensureMutable();
- m_private->downloadMetadata = downloadMetadata;
+ m_private->setData(mimeTypeDownloadURL, downloadMetadata);
}
WebString WebDragData::fileExtension() const
{
ASSERT(!isNull());
- return m_private->fileExtension;
+ return m_private->fileExtension();
}
void WebDragData::setFileExtension(const WebString& fileExtension)
{
ensureMutable();
- m_private->fileExtension = fileExtension;
+ m_private->setFileExtension(fileExtension);
}
-bool WebDragData::hasFileNames() const
+bool WebDragData::containsFilenames() const
{
ASSERT(!isNull());
- return !m_private->filenames.isEmpty();
+ return m_private->containsFilenames();
}
-void WebDragData::fileNames(WebVector<WebString>& fileNames) const
+void WebDragData::filenames(WebVector<WebString>& filenames) const
{
ASSERT(!isNull());
- fileNames = m_private->filenames;
+ filenames = m_private->filenames();
}
-void WebDragData::setFileNames(const WebVector<WebString>& fileNames)
+void WebDragData::setFilenames(const WebVector<WebString>& filenames)
{
ensureMutable();
- m_private->filenames.clear();
- m_private->filenames.append(fileNames.data(), fileNames.size());
+ Vector<String> filenamesCopy;
+ filenamesCopy.append(filenames.data(), filenames.size());
+ m_private->setFilenames(filenamesCopy);
}
-void WebDragData::appendToFileNames(const WebString& fileName)
+void WebDragData::appendToFilenames(const WebString& filename)
{
ensureMutable();
- m_private->filenames.append(fileName);
+ Vector<String> filenames = m_private->filenames();
+ filenames.append(filename);
+ m_private->setFilenames(filenames);
}
WebString WebDragData::plainText() const
{
ASSERT(!isNull());
- return m_private->plainText;
+ bool ignoredSuccess;
+ return m_private->getData(mimeTypeTextPlain, ignoredSuccess);
}
void WebDragData::setPlainText(const WebString& plainText)
{
ensureMutable();
- m_private->plainText = plainText;
+ m_private->setData(mimeTypeTextPlain, plainText);
}
WebString WebDragData::htmlText() const
{
ASSERT(!isNull());
- return m_private->textHtml;
+ bool ignoredSuccess;
+ return m_private->getData(mimeTypeTextHTML, ignoredSuccess);
}
void WebDragData::setHTMLText(const WebString& htmlText)
{
ensureMutable();
- m_private->textHtml = htmlText;
+ m_private->setData(mimeTypeTextHTML, htmlText);
}
WebURL WebDragData::htmlBaseURL() const
{
ASSERT(!isNull());
- return m_private->htmlBaseUrl;
+ return m_private->htmlBaseUrl();
}
void WebDragData::setHTMLBaseURL(const WebURL& htmlBaseURL)
{
ensureMutable();
- m_private->htmlBaseUrl = htmlBaseURL;
+ m_private->setHtmlBaseUrl(htmlBaseURL);
}
-WebString WebDragData::fileContentFileName() const
+WebString WebDragData::fileContentFilename() const
{
ASSERT(!isNull());
- return m_private->fileContentFilename;
+ return m_private->fileContentFilename();
}
-void WebDragData::setFileContentFileName(const WebString& fileName)
+void WebDragData::setFileContentFilename(const WebString& filename)
{
ensureMutable();
- m_private->fileContentFilename = fileName;
+ m_private->setFileContentFilename(filename);
}
WebData WebDragData::fileContent() const
{
ASSERT(!isNull());
- return WebData(m_private->fileContent);
+ return WebData(m_private->fileContent());
}
void WebDragData::setFileContent(const WebData& fileContent)
{
ensureMutable();
- m_private->fileContent = fileContent;
+ m_private->setFileContent(fileContent);
}
WebDragData::WebDragData(const WTF::PassRefPtr<WebCore::ChromiumDataObject>& data)
@@ -236,8 +233,7 @@ void WebDragData::assign(WebDragDataPrivate* p)
void WebDragData::ensureMutable()
{
ASSERT(!isNull());
- if (!m_private->hasOneRef())
- assign(static_cast<WebDragDataPrivate*>(m_private->copy().releaseRef()));
+ ASSERT(m_private->hasOneRef());
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebElement.cpp b/WebKit/chromium/src/WebElement.cpp
index d0a0862..34daa34 100644
--- a/WebKit/chromium/src/WebElement.cpp
+++ b/WebKit/chromium/src/WebElement.cpp
@@ -32,26 +32,24 @@
#include "WebElement.h"
#include "Element.h"
+#include "RenderBoxModelObject.h"
+#include "RenderObject.h"
#include <wtf/PassRefPtr.h>
+#include "WebNamedNodeMap.h"
+
using namespace WebCore;
namespace WebKit {
-WebElement::WebElement(const WTF::PassRefPtr<WebCore::Element>& elem)
- : WebNode(elem.releaseRef())
-{
-}
-
-WebElement& WebElement::operator=(const WTF::PassRefPtr<WebCore::Element>& elem)
+bool WebElement::isFormControlElement() const
{
- WebNode::assign(elem.releaseRef());
- return *this;
+ return constUnwrap<Element>()->isFormControlElement();
}
-WebElement::operator WTF::PassRefPtr<Element>() const
+bool WebElement::isTextFormControlElement() const
{
- return PassRefPtr<Element>(static_cast<Element*>(m_private));
+ return constUnwrap<Element>()->isTextFormControl();
}
WebString WebElement::tagName() const
@@ -62,7 +60,7 @@ WebString WebElement::tagName() const
bool WebElement::hasTagName(const WebString& tagName) const
{
return equalIgnoringCase(constUnwrap<Element>()->tagName(),
- tagName.operator WebCore::String());
+ tagName.operator String());
}
bool WebElement::hasAttribute(const WebString& attrName) const
@@ -82,10 +80,35 @@ bool WebElement::setAttribute(const WebString& attrName, const WebString& attrVa
return !exceptionCode;
}
+WebNamedNodeMap WebElement::attributes() const
+{
+ return WebNamedNodeMap(m_private->attributes());
+}
+
WebString WebElement::innerText() const
{
return constUnwrap<Element>()->innerText();
}
-} // namespace WebKit
+WebString WebElement::computeInheritedLanguage() const
+{
+ return WebString(constUnwrap<Element>()->computeInheritedLanguage());
+}
+WebElement::WebElement(const PassRefPtr<Element>& elem)
+ : WebNode(elem)
+{
+}
+
+WebElement& WebElement::operator=(const PassRefPtr<Element>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebElement::operator PassRefPtr<Element>() const
+{
+ return static_cast<Element*>(m_private.get());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebEntities.cpp b/WebKit/chromium/src/WebEntities.cpp
index b9143d9..4e37dde 100644
--- a/WebKit/chromium/src/WebEntities.cpp
+++ b/WebKit/chromium/src/WebEntities.cpp
@@ -31,69 +31,26 @@
#include "config.h"
#include "WebEntities.h"
-#include <string.h>
-
-#include "PlatformString.h"
-#include "StringBuilder.h"
-#include <wtf/HashMap.h>
-
#include "WebString.h"
-using namespace WebCore;
-
-namespace {
-// Note that this file is also included by HTMLTokenizer.cpp so we are getting
-// two copies of the data in memory. We can fix this by changing the script
-// that generated the array to create a static const that is its length, but
-// this is low priority since the data is less than 4K. We use anonymous
-// namespace to prevent name collisions.
-#include "HTMLEntityNames.c" // NOLINT
-}
+#include <string.h>
+#include <wtf/HashMap.h>
+#include <wtf/text/StringBuilder.h>
+#include <wtf/text/WTFString.h>
namespace WebKit {
-void populateMap(WTF::HashMap<int, WebCore::String>& map,
- const Entity* entities,
- size_t entitiesCount,
- bool standardHTML)
-{
- ASSERT(map.isEmpty());
- const Entity* entity = &entities[0];
- for (size_t i = 0; i < entitiesCount; i++, entity++) {
- int code = entity->code;
- String name = entity->name;
- // For consistency, use the lowe case for entities that have both.
- if (map.contains(code) && map.get(code) == name.lower())
- continue;
- // Don't register &percnt;, &nsup; and &supl;.
- if (standardHTML && (code == '%' || code == 0x2285 || code == 0x00b9))
- continue;
- map.set(code, name);
- }
- if (standardHTML)
- map.set(static_cast<int>(0x0027), String("#39"));
-}
-
-static const Entity xmlBuiltInEntityCodes[] = {
- { "lt", 0x003c },
- { "gt", 0x003e },
- { "amp", 0x0026 },
- { "apos", 0x0027 },
- { "quot", 0x0022 }
-};
-
WebEntities::WebEntities(bool xmlEntities)
{
- if (xmlEntities)
- populateMap(m_entitiesMap,
- xmlBuiltInEntityCodes,
- sizeof(xmlBuiltInEntityCodes) / sizeof(Entity),
- false);
- else
- populateMap(m_entitiesMap,
- wordlist,
- sizeof(wordlist) / sizeof(Entity),
- true);
+ ASSERT(m_entitiesMap.isEmpty());
+ m_entitiesMap.set(0x003c, "lt");
+ m_entitiesMap.set(0x003e, "gt");
+ m_entitiesMap.set(0x0026, "amp");
+ m_entitiesMap.set(0x0027, "apos");
+ m_entitiesMap.set(0x0022, "quot");
+ // We add #39 for test-compatibility reason.
+ if (!xmlEntities)
+ m_entitiesMap.set(0x0027, String("#39"));
}
String WebEntities::entityNameByCode(int code) const
@@ -116,9 +73,9 @@ String WebEntities::convertEntitiesInString(const String& value) const
// Append content before entity code.
if (curPos > startPos)
result.append(String(startPos, curPos - startPos));
- result.append("&");
+ result.append('&');
result.append(m_entitiesMap.get(*curPos));
- result.append(";");
+ result.append(';');
startPos = ++curPos;
} else
curPos++;
diff --git a/WebKit/chromium/src/WebEntities.h b/WebKit/chromium/src/WebEntities.h
index ad3c310..f210566 100644
--- a/WebKit/chromium/src/WebEntities.h
+++ b/WebKit/chromium/src/WebEntities.h
@@ -36,6 +36,7 @@
namespace WebKit {
+// FIXME: This class is wrong and needs to be removed.
class WebEntities {
public:
// &apos;, &percnt;, &nsup;, &supl; are not defined by the HTML standards.
@@ -59,12 +60,12 @@ public:
// entity name. If yes, return the entity notation. If not, returns an
// empty string. Parameter isHTML indicates check the code in html entity
// map or in xml entity map.
- WebCore::String entityNameByCode(int code) const;
+ WTF::String entityNameByCode(int code) const;
// Returns a new string with corresponding entity names replaced.
- WebCore::String convertEntitiesInString(const WebCore::String&) const;
+ WTF::String convertEntitiesInString(const WTF::String&) const;
private:
- typedef HashMap<int, WebCore::String> EntitiesMapType;
+ typedef HashMap<int, WTF::String> EntitiesMapType;
// An internal object that maps the Unicode character to corresponding
// entity notation.
EntitiesMapType m_entitiesMap;
diff --git a/WebKit/chromium/src/WebFileChooserCompletionImpl.cpp b/WebKit/chromium/src/WebFileChooserCompletionImpl.cpp
index 4152dc5..ef2409c 100644
--- a/WebKit/chromium/src/WebFileChooserCompletionImpl.cpp
+++ b/WebKit/chromium/src/WebFileChooserCompletionImpl.cpp
@@ -48,7 +48,7 @@ void WebFileChooserCompletionImpl::didChooseFile(const WebVector<WebString>& fil
m_fileChooser->chooseFile(fileNames[0]);
else {
// This clause handles a case of file_names.size()==0 too.
- Vector<WebCore::String> paths;
+ Vector<WTF::String> paths;
for (size_t i = 0; i < fileNames.size(); ++i)
paths.append(fileNames[i]);
m_fileChooser->chooseFiles(paths);
diff --git a/WebKit/chromium/src/WebFileChooserCompletionImpl.h b/WebKit/chromium/src/WebFileChooserCompletionImpl.h
index fe759e0..147d1f7 100644
--- a/WebKit/chromium/src/WebFileChooserCompletionImpl.h
+++ b/WebKit/chromium/src/WebFileChooserCompletionImpl.h
@@ -31,14 +31,11 @@
#ifndef WebFileChooserCompletionImpl_h
#define WebFileChooserCompletionImpl_h
-// FIXME: These relative paths are a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebFileChooserCompletion.h"
-#include "../public/WebString.h"
-#include "../public/WebVector.h"
+#include "WebFileChooserCompletion.h"
+#include "WebString.h"
+#include "WebVector.h"
#include "FileChooser.h"
-
#include <wtf/PassRefPtr.h>
using WebKit::WebFileChooserCompletion;
diff --git a/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp b/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp
new file mode 100644
index 0000000..52a4032
--- /dev/null
+++ b/WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+#include "config.h"
+#include "WebFileSystemCallbacksImpl.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileSystemCallbacks.h"
+#include "AsyncFileSystemChromium.h"
+#include "FileMetadata.h"
+#include "ScriptExecutionContext.h"
+#include "WebFileSystemEntry.h"
+#include "WebFileInfo.h"
+#include "WebString.h"
+#include "WorkerAsyncFileSystemChromium.h"
+#include <wtf/Vector.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebFileSystemCallbacksImpl::WebFileSystemCallbacksImpl(PassOwnPtr<AsyncFileSystemCallbacks> callbacks, WebCore::ScriptExecutionContext* context, bool synchronous)
+ : m_callbacks(callbacks)
+ , m_context(context)
+ , m_synchronous(synchronous)
+{
+ ASSERT(m_callbacks);
+}
+
+WebFileSystemCallbacksImpl::~WebFileSystemCallbacksImpl()
+{
+}
+
+void WebFileSystemCallbacksImpl::didSucceed()
+{
+ m_callbacks->didSucceed();
+ delete this;
+}
+
+void WebFileSystemCallbacksImpl::didReadMetadata(const WebFileInfo& webFileInfo)
+{
+ FileMetadata fileMetadata;
+ fileMetadata.modificationTime = webFileInfo.modificationTime;
+ fileMetadata.length = webFileInfo.length;
+ fileMetadata.type = static_cast<FileMetadata::Type>(webFileInfo.type);
+ m_callbacks->didReadMetadata(fileMetadata);
+ delete this;
+}
+
+void WebFileSystemCallbacksImpl::didReadDirectory(const WebVector<WebFileSystemEntry>& entries, bool hasMore)
+{
+ for (size_t i = 0; i < entries.size(); ++i)
+ m_callbacks->didReadDirectoryEntry(entries[i].name, entries[i].isDirectory);
+ m_callbacks->didReadDirectoryEntries(hasMore);
+ delete this;
+}
+
+void WebFileSystemCallbacksImpl::didOpenFileSystem(const WebString& name, const WebString& path)
+{
+ if (m_context && m_context->isWorkerContext())
+ m_callbacks->didOpenFileSystem(name, WorkerAsyncFileSystemChromium::create(m_context, path, m_synchronous));
+ else
+ m_callbacks->didOpenFileSystem(name, AsyncFileSystemChromium::create(path));
+ delete this;
+}
+
+void WebFileSystemCallbacksImpl::didFail(WebFileError error)
+{
+ m_callbacks->didFail(error);
+ delete this;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebKit/chromium/src/WebFileSystemCallbacksImpl.h b/WebKit/chromium/src/WebFileSystemCallbacksImpl.h
new file mode 100644
index 0000000..75fa2bb
--- /dev/null
+++ b/WebKit/chromium/src/WebFileSystemCallbacksImpl.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WebFileSystemCallbacksImpl_h
+#define WebFileSystemCallbacksImpl_h
+
+#include "WebFileSystemCallbacks.h"
+#include "WebVector.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+
+namespace WebCore {
+class AsyncFileSystemCallbacks;
+class ScriptExecutionContext;
+}
+
+namespace WebKit {
+
+struct WebFileInfo;
+struct WebFileSystemEntry;
+class WebString;
+
+class WebFileSystemCallbacksImpl : public WebFileSystemCallbacks {
+public:
+ WebFileSystemCallbacksImpl(PassOwnPtr<WebCore::AsyncFileSystemCallbacks>, WebCore::ScriptExecutionContext* = 0, bool synchronous = false);
+ virtual ~WebFileSystemCallbacksImpl();
+
+ virtual void didSucceed();
+ virtual void didReadMetadata(const WebFileInfo& info);
+ virtual void didReadDirectory(const WebVector<WebFileSystemEntry>& entries, bool hasMore);
+ virtual void didOpenFileSystem(const WebString& name, const WebString& rootPath);
+ virtual void didFail(WebFileError error);
+
+private:
+ OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks;
+
+ // Used for worker's openFileSystem callbacks.
+ WebCore::ScriptExecutionContext* m_context;
+ bool m_synchronous;
+};
+
+} // namespace WebKit
+
+#endif // WebFileSystemCallbacksImpl_h
diff --git a/WebKit/chromium/src/WebFontDescription.cpp b/WebKit/chromium/src/WebFontDescription.cpp
new file mode 100644
index 0000000..18f6830
--- /dev/null
+++ b/WebKit/chromium/src/WebFontDescription.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebFontDescription.h"
+
+#include "FontDescription.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebFontDescription::WebFontDescription(const FontDescription& desc,
+ short fontLetterSpacing, short fontWordSpacing)
+{
+ family = desc.family().family();
+ genericFamily = static_cast<GenericFamily>(desc.genericFamily());
+ size = desc.specifiedSize();
+ italic = desc.italic();
+ smallCaps = desc.smallCaps();
+ weight = static_cast<Weight>(desc.weight());
+ smoothing = static_cast<Smoothing>(desc.fontSmoothing());
+ letterSpacing = fontLetterSpacing;
+ wordSpacing = fontWordSpacing;
+}
+
+WebFontDescription::operator WebCore::FontDescription() const
+{
+ FontFamily fontFamily;
+ fontFamily.setFamily(family);
+
+ FontDescription desc;
+ desc.setFamily(fontFamily);
+ desc.setGenericFamily(static_cast<FontDescription::GenericFamilyType>(genericFamily));
+ desc.setSpecifiedSize(size);
+ desc.setComputedSize(size);
+ desc.setItalic(italic);
+ desc.setSmallCaps(smallCaps);
+ desc.setWeight(static_cast<FontWeight>(weight));
+ desc.setFontSmoothing(static_cast<FontSmoothingMode>(smoothing));
+ return desc;
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebFontImpl.cpp b/WebKit/chromium/src/WebFontImpl.cpp
new file mode 100644
index 0000000..8c61997
--- /dev/null
+++ b/WebKit/chromium/src/WebFontImpl.cpp
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebFontImpl.h"
+
+#include "Font.h"
+#include "FontDescription.h"
+#include "GraphicsContext.h"
+#include "PlatformContextSkia.h"
+#include "WebFloatPoint.h"
+#include "WebFloatRect.h"
+#include "WebFontDescription.h"
+#include "WebRect.h"
+#include "WebTextRun.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebFont* WebFont::create(const WebFontDescription& desc)
+{
+ return new WebFontImpl(desc, desc.letterSpacing, desc.wordSpacing);
+}
+
+WebFontImpl::WebFontImpl(const FontDescription& desc, short letterSpacing, short wordSpacing)
+ : m_font(desc, letterSpacing, wordSpacing)
+{
+ m_font.update(0);
+}
+
+WebFontDescription WebFontImpl::fontDescription() const
+{
+ return WebFontDescription(m_font.fontDescription(), m_font.letterSpacing(), m_font.wordSpacing());
+}
+
+int WebFontImpl::ascent() const
+{
+ return m_font.ascent();
+}
+
+int WebFontImpl::descent() const
+{
+ return m_font.descent();
+}
+
+int WebFontImpl::height() const
+{
+ return m_font.height();
+}
+
+int WebFontImpl::lineSpacing() const
+{
+ return m_font.lineSpacing();
+}
+
+float WebFontImpl::xHeight() const
+{
+ return m_font.xHeight();
+}
+
+void WebFontImpl::drawText(WebCanvas* canvas, const WebTextRun& run, const WebFloatPoint& leftBaseline,
+ WebColor color, const WebRect& clip, bool canvasIsOpaque,
+ int from, int to) const
+{
+ // FIXME hook canvasIsOpaque up to the platform-specific indicators for
+ // whether subpixel AA can be used for this draw. On Windows, this is
+ // PlatformContextSkia::setDrawingToImageBuffer.
+#if WEBKIT_USING_CG
+ GraphicsContext gc(canvas);
+#elif WEBKIT_USING_SKIA
+ PlatformContextSkia context(canvas);
+ // PlatformGraphicsContext is actually a pointer to PlatformContextSkia.
+ GraphicsContext gc(reinterpret_cast<PlatformGraphicsContext*>(&context));
+#else
+ notImplemented();
+#endif
+
+ gc.save();
+ gc.setFillColor(color, ColorSpaceDeviceRGB);
+ gc.clip(WebCore::FloatRect(clip));
+ m_font.drawText(&gc, run, leftBaseline, from, to);
+ gc.restore();
+}
+
+int WebFontImpl::calculateWidth(const WebTextRun& run) const
+{
+ return m_font.width(run, 0);
+}
+
+int WebFontImpl::offsetForPosition(const WebTextRun& run, float position) const
+{
+ return m_font.offsetForPosition(run, position, true);
+}
+
+WebFloatRect WebFontImpl::selectionRectForText(const WebTextRun& run, const WebFloatPoint& leftBaseline, int height, int from, int to) const
+{
+ return m_font.selectionRectForText(run, leftBaseline, height, from, to);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/ProfilerAgent.h b/WebKit/chromium/src/WebFontImpl.h
index 52337b8..3ac9031 100644
--- a/WebKit/chromium/src/ProfilerAgent.h
+++ b/WebKit/chromium/src/WebFontImpl.h
@@ -28,33 +28,38 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ProfilerAgent_h
-#define ProfilerAgent_h
+#ifndef WebFontImpl_h
+#define WebFontImpl_h
-#include "DevToolsRPC.h"
+#include "Font.h"
+#include "WebFont.h"
+
+namespace WebCore { class FontDescription; }
namespace WebKit {
-// Profiler agent provides API for retrieving profiler data.
-// These methods are handled on the IO thread, so profiler can
-// operate while a script on a page performs heavy work.
-#define PROFILER_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \
- /* Requests current profiler state. */ \
- METHOD0(getActiveProfilerModules) \
- \
- /* Retrieves portion of profiler log. */ \
- METHOD1(getLogLines, int /* position */)
-
-DEFINE_RPC_CLASS(ProfilerAgent, PROFILER_AGENT_STRUCT)
-
-#define PROFILER_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, METHOD4, METHOD5) \
- /* Response to getActiveProfilerModules. */ \
- METHOD1(didGetActiveProfilerModules, int /* flags */) \
- \
- /* Response to getLogLines. */ \
- METHOD2(didGetLogLines, int /* position */, String /* log */)
-
-DEFINE_RPC_CLASS(ProfilerAgentDelegate, PROFILER_AGENT_DELEGATE_STRUCT)
+class WebFontImpl : public WebFont {
+public:
+ WebFontImpl(const WebCore::FontDescription&, short letterSpacing, short wordSpacing);
+
+ virtual WebFontDescription fontDescription() const;
+
+ virtual int ascent() const;
+ virtual int descent() const;
+ virtual int height() const;
+ virtual int lineSpacing() const;
+ virtual float xHeight() const;
+
+ virtual void drawText(WebCanvas*, const WebTextRun&, const WebFloatPoint& leftBaseline, WebColor,
+ const WebRect& clip, bool canvasIsOpaque, int from = 0, int to = -1) const;
+ virtual int calculateWidth(const WebTextRun&) const;
+ virtual int offsetForPosition(const WebTextRun&, float position) const;
+ virtual WebFloatRect selectionRectForText(const WebTextRun&, const WebFloatPoint& leftBaseline,
+ int height, int from = 0, int to = -1) const;
+
+private:
+ WebCore::Font m_font;
+};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebFormControlElement.cpp b/WebKit/chromium/src/WebFormControlElement.cpp
new file mode 100644
index 0000000..a75fe5c
--- /dev/null
+++ b/WebKit/chromium/src/WebFormControlElement.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebFormControlElement.h"
+
+#include "HTMLFormControlElement.h"
+#include <wtf/PassRefPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+bool WebFormControlElement::isEnabled() const
+{
+ return constUnwrap<HTMLFormControlElement>()->isEnabledFormControl();
+}
+
+WebString WebFormControlElement::formControlName() const
+{
+ return constUnwrap<HTMLFormControlElement>()->name();
+}
+
+WebString WebFormControlElement::formControlType() const
+{
+ return constUnwrap<HTMLFormControlElement>()->type();
+}
+
+WebString WebFormControlElement::nameForAutofill() const
+{
+ String name = constUnwrap<HTMLFormControlElement>()->name();
+ String trimmedName = name.stripWhiteSpace();
+ if (!trimmedName.isEmpty())
+ return trimmedName;
+ name = constUnwrap<HTMLFormControlElement>()->getIdAttribute();
+ trimmedName = name.stripWhiteSpace();
+ if (!trimmedName.isEmpty())
+ return trimmedName;
+ return String();
+}
+
+WebFormControlElement::WebFormControlElement(const PassRefPtr<HTMLFormControlElement>& elem)
+ : WebElement(elem)
+{
+}
+
+WebFormControlElement& WebFormControlElement::operator=(const PassRefPtr<HTMLFormControlElement>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebFormControlElement::operator PassRefPtr<HTMLFormControlElement>() const
+{
+ return static_cast<HTMLFormControlElement*>(m_private.get());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebFormElement.cpp b/WebKit/chromium/src/WebFormElement.cpp
index 5471608..7a01053 100644
--- a/WebKit/chromium/src/WebFormElement.cpp
+++ b/WebKit/chromium/src/WebFormElement.cpp
@@ -31,10 +31,13 @@
#include "config.h"
#include "WebFormElement.h"
+#include "FormState.h"
#include "HTMLFormControlElement.h"
#include "HTMLFormElement.h"
#include "HTMLInputElement.h"
#include "HTMLNames.h"
+#include "WebFormControlElement.h"
+#include "WebInputElement.h"
#include "WebString.h"
#include "WebURL.h"
#include <wtf/PassRefPtr.h>
@@ -43,25 +46,6 @@ using namespace WebCore;
namespace WebKit {
-class WebFormPrivate : public HTMLFormElement {
-};
-
-WebFormElement::WebFormElement(const WTF::PassRefPtr<HTMLFormElement>& e)
- : WebElement(e.releaseRef())
-{
-}
-
-WebFormElement& WebFormElement::operator=(const WTF::PassRefPtr<HTMLFormElement>& e)
-{
- WebNode::assign(e.releaseRef());
- return *this;
-}
-
-WebFormElement::operator WTF::PassRefPtr<WebCore::HTMLFormElement>() const
-{
- return PassRefPtr<HTMLFormElement>(static_cast<HTMLFormElement*>(m_private));
-}
-
bool WebFormElement::autoComplete() const
{
return constUnwrap<HTMLFormElement>()->autoComplete();
@@ -72,16 +56,21 @@ WebString WebFormElement::action() const
return constUnwrap<HTMLFormElement>()->action();
}
-WebString WebFormElement::name() const
+WebString WebFormElement::name() const
{
return constUnwrap<HTMLFormElement>()->name();
}
-WebString WebFormElement::method() const
+WebString WebFormElement::method() const
{
return constUnwrap<HTMLFormElement>()->method();
}
-
+
+bool WebFormElement::wasUserSubmitted() const
+{
+ return constUnwrap<HTMLFormElement>()->wasUserSubmitted();
+}
+
void WebFormElement::submit()
{
unwrap<HTMLFormElement>()->submit();
@@ -94,17 +83,36 @@ void WebFormElement::getNamedElements(const WebString& name,
unwrap<HTMLFormElement>()->getNamedElements(name, tempVector);
result.assign(tempVector);
}
-
-void WebFormElement::getInputElements(WebVector<WebInputElement>& result) const
+
+void WebFormElement::getFormControlElements(WebVector<WebFormControlElement>& result) const
{
const HTMLFormElement* form = constUnwrap<HTMLFormElement>();
- Vector<RefPtr<HTMLInputElement> > tempVector;
- for (size_t i = 0; i < form->formElements.size(); i++) {
- if (form->formElements[i]->hasLocalName(HTMLNames::inputTag))
- tempVector.append(static_cast<HTMLInputElement*>(
- form->formElements[i]));
+ Vector<RefPtr<HTMLFormControlElement> > tempVector;
+ // FIXME: We should move the for-loop condition into a variable instead of
+ // re-evaluating size each time. Also, consider refactoring this code so that
+ // we don't call form->associatedElements() multiple times.
+ for (size_t i = 0; i < form->associatedElements().size(); i++) {
+ if (form->associatedElements()[i]->hasLocalName(HTMLNames::inputTag)
+ || form->associatedElements()[i]->hasLocalName(HTMLNames::selectTag))
+ tempVector.append(form->associatedElements()[i]);
}
result.assign(tempVector);
}
+WebFormElement::WebFormElement(const PassRefPtr<HTMLFormElement>& e)
+ : WebElement(e)
+{
+}
+
+WebFormElement& WebFormElement::operator=(const PassRefPtr<HTMLFormElement>& e)
+{
+ m_private = e;
+ return *this;
+}
+
+WebFormElement::operator PassRefPtr<HTMLFormElement>() const
+{
+ return static_cast<HTMLFormElement*>(m_private.get());
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebFrameImpl.cpp b/WebKit/chromium/src/WebFrameImpl.cpp
index 2f911f1..4422e1b 100644
--- a/WebKit/chromium/src/WebFrameImpl.cpp
+++ b/WebKit/chromium/src/WebFrameImpl.cpp
@@ -71,25 +71,25 @@
#include "config.h"
#include "WebFrameImpl.h"
+#include "AssociatedURLLoader.h"
#include "Chrome.h"
#include "ChromiumBridge.h"
#include "ClipboardUtilitiesChromium.h"
#include "Console.h"
+#include "DOMUtilitiesPrivate.h"
+#include "DOMWindow.h"
#include "Document.h"
#include "DocumentFragment.h" // Only needed for ReplaceSelectionCommand.h :(
#include "DocumentLoader.h"
#include "DocumentMarker.h"
-#include "DOMUtilitiesPrivate.h"
-#include "DOMWindow.h"
#include "Editor.h"
#include "EventHandler.h"
#include "FormState.h"
-#include "FrameLoader.h"
#include "FrameLoadRequest.h"
+#include "FrameLoader.h"
#include "FrameTree.h"
#include "FrameView.h"
#include "GraphicsContext.h"
-#include "HistoryItem.h"
#include "HTMLCollection.h"
#include "HTMLFormElement.h"
#include "HTMLFrameOwnerElement.h"
@@ -97,10 +97,12 @@
#include "HTMLInputElement.h"
#include "HTMLLinkElement.h"
#include "HTMLNames.h"
+#include "HistoryItem.h"
#include "InspectorController.h"
-#include "markup.h"
#include "Page.h"
+#include "Performance.h"
#include "PlatformContextSkia.h"
+#include "PluginDocument.h"
#include "PrintContext.h"
#include "RenderFrame.h"
#include "RenderTreeAsText.h"
@@ -109,11 +111,12 @@
#include "ReplaceSelectionCommand.h"
#include "ResourceHandle.h"
#include "ResourceRequest.h"
+#include "SVGSMILElement.h"
#include "ScriptController.h"
#include "ScriptSourceCode.h"
#include "ScriptValue.h"
-#include "ScrollbarTheme.h"
#include "ScrollTypes.h"
+#include "ScrollbarTheme.h"
#include "SelectionController.h"
#include "Settings.h"
#include "SkiaUtils.h"
@@ -130,6 +133,9 @@
#include "WebHistoryItem.h"
#include "WebInputElement.h"
#include "WebPasswordAutocompleteListener.h"
+#include "WebPerformance.h"
+#include "WebPlugin.h"
+#include "WebPluginContainerImpl.h"
#include "WebRange.h"
#include "WebRect.h"
#include "WebScriptSource.h"
@@ -139,6 +145,7 @@
#include "WebVector.h"
#include "WebViewImpl.h"
#include "XPathResult.h"
+#include "markup.h"
#include <algorithm>
#include <wtf/CurrentTime.h>
@@ -148,7 +155,7 @@
#include "LocalCurrentGraphicsContext.h"
#endif
-#if OS(LINUX)
+#if OS(LINUX) || OS(FREEBSD)
#include <gdk/gdk.h>
#endif
@@ -231,6 +238,15 @@ static void frameContentAsPlainText(size_t maxChars, Frame* frame,
// Recursively walk the children.
FrameTree* frameTree = frame->tree();
for (Frame* curChild = frameTree->firstChild(); curChild; curChild = curChild->tree()->nextSibling()) {
+ // Ignore the text of non-visible frames.
+ RenderView* contentRenderer = curChild->contentRenderer();
+ RenderPart* ownerRenderer = curChild->ownerRenderer();
+ if (!contentRenderer || !contentRenderer->width() || !contentRenderer->height()
+ || (contentRenderer->x() + contentRenderer->width() <= 0) || (contentRenderer->y() + contentRenderer->height() <= 0)
+ || (ownerRenderer && ownerRenderer->style() && ownerRenderer->style()->visibility() != VISIBLE)) {
+ continue;
+ }
+
// Make sure the frame separator won't fill up the buffer, and give up if
// it will. The danger is if the separator will make the buffer longer than
// maxChars. This will cause the computation above:
@@ -246,7 +262,24 @@ static void frameContentAsPlainText(size_t maxChars, Frame* frame,
}
}
-// Simple class to override some of PrintContext behavior.
+static long long generateFrameIdentifier()
+{
+ static long long next = 0;
+ return ++next;
+}
+
+WebPluginContainerImpl* WebFrameImpl::pluginContainerFromFrame(Frame* frame)
+{
+ if (!frame)
+ return 0;
+ if (!frame->document() || !frame->document()->isPluginDocument())
+ return 0;
+ PluginDocument* pluginDocument = static_cast<PluginDocument*>(frame->document());
+ return static_cast<WebPluginContainerImpl *>(pluginDocument->pluginWidget());
+}
+
+// Simple class to override some of PrintContext behavior. Some of the methods
+// made virtual so that they can be overriden by ChromePluginPrintContext.
class ChromePrintContext : public PrintContext, public Noncopyable {
public:
ChromePrintContext(Frame* frame)
@@ -255,28 +288,38 @@ public:
{
}
- void begin(float width)
+ virtual void begin(float width, float height)
{
ASSERT(!m_printedPageWidth);
m_printedPageWidth = width;
- PrintContext::begin(m_printedPageWidth);
+ PrintContext::begin(m_printedPageWidth, height);
+ }
+
+ virtual void end()
+ {
+ PrintContext::end();
}
- float getPageShrink(int pageNumber) const
+ virtual float getPageShrink(int pageNumber) const
{
IntRect pageRect = m_pageRects[pageNumber];
return m_printedPageWidth / pageRect.width();
}
- // Spools the printed page, a subrect of m_frame. Skip the scale step.
+ // Spools the printed page, a subrect of m_frame. Skip the scale step.
// NativeTheme doesn't play well with scaling. Scaling is done browser side
- // instead. Returns the scale to be applied.
- float spoolPage(GraphicsContext& ctx, int pageNumber)
+ // instead. Returns the scale to be applied.
+ // On Linux, we don't have the problem with NativeTheme, hence we let WebKit
+ // do the scaling and ignore the return value.
+ virtual float spoolPage(GraphicsContext& ctx, int pageNumber)
{
IntRect pageRect = m_pageRects[pageNumber];
float scale = m_printedPageWidth / pageRect.width();
ctx.save();
+#if OS(LINUX) || OS(FREEBSD)
+ ctx.scale(WebCore::FloatSize(scale, scale));
+#endif
ctx.translate(static_cast<float>(-pageRect.x()),
static_cast<float>(-pageRect.y()));
ctx.clip(pageRect);
@@ -285,11 +328,95 @@ public:
return scale;
}
+ virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight)
+ {
+ return PrintContext::computePageRects(printRect, headerHeight, footerHeight, userScaleFactor, outPageHeight);
+ }
+
+ virtual int pageCount() const
+ {
+ return PrintContext::pageCount();
+ }
+
+ virtual bool shouldUseBrowserOverlays() const
+ {
+ return true;
+ }
+
private:
// Set when printing.
float m_printedPageWidth;
};
+// Simple class to override some of PrintContext behavior. This is used when
+// the frame hosts a plugin that supports custom printing. In this case, we
+// want to delegate all printing related calls to the plugin.
+class ChromePluginPrintContext : public ChromePrintContext {
+public:
+ ChromePluginPrintContext(Frame* frame, int printerDPI)
+ : ChromePrintContext(frame), m_pageCount(0), m_printerDPI(printerDPI)
+ {
+ // This HAS to be a frame hosting a full-mode plugin
+ ASSERT(frame->document()->isPluginDocument());
+ }
+
+ virtual void begin(float width)
+ {
+ }
+
+ virtual void end()
+ {
+ WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame);
+ if (pluginContainer && pluginContainer->supportsPaginatedPrint())
+ pluginContainer->printEnd();
+ else
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual float getPageShrink(int pageNumber) const
+ {
+ // We don't shrink the page (maybe we should ask the widget ??)
+ return 1.0;
+ }
+
+ virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight)
+ {
+ WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame);
+ if (pluginContainer && pluginContainer->supportsPaginatedPrint())
+ m_pageCount = pluginContainer->printBegin(IntRect(printRect), m_printerDPI);
+ else
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual int pageCount() const
+ {
+ return m_pageCount;
+ }
+
+ // Spools the printed page, a subrect of m_frame. Skip the scale step.
+ // NativeTheme doesn't play well with scaling. Scaling is done browser side
+ // instead. Returns the scale to be applied.
+ virtual float spoolPage(GraphicsContext& ctx, int pageNumber)
+ {
+ WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame);
+ if (pluginContainer && pluginContainer->supportsPaginatedPrint())
+ pluginContainer->printPage(pageNumber, &ctx);
+ else
+ ASSERT_NOT_REACHED();
+ return 1.0;
+ }
+
+ virtual bool shouldUseBrowserOverlays() const
+ {
+ return false;
+ }
+
+private:
+ // Set when printing.
+ int m_pageCount;
+ int m_printerDPI;
+};
+
static WebDataSource* DataSourceForDocLoader(DocumentLoader* loader)
{
return loader ? WebDataSourceImpl::fromDocumentLoader(loader) : 0;
@@ -360,12 +487,17 @@ WebFrame* WebFrame::fromFrameOwnerElement(const WebElement& element)
WebString WebFrameImpl::name() const
{
- return m_frame->tree()->name();
+ return m_frame->tree()->uniqueName();
+}
+
+void WebFrameImpl::setName(const WebString& name)
+{
+ m_frame->tree()->setName(name);
}
-void WebFrameImpl::clearName()
+long long WebFrameImpl::identifier() const
{
- m_frame->tree()->clearName();
+ return m_identifier;
}
WebURL WebFrameImpl::url() const
@@ -413,7 +545,7 @@ WebURL WebFrameImpl::openSearchDescriptionURL() const
WebString WebFrameImpl::encoding() const
{
- return frame()->loader()->encoding();
+ return frame()->loader()->writer()->encoding();
}
WebSize WebFrameImpl::scrollOffset() const
@@ -433,7 +565,7 @@ WebSize WebFrameImpl::contentsSize() const
int WebFrameImpl::contentsPreferredWidth() const
{
if (m_frame->document() && m_frame->document()->renderView())
- return m_frame->document()->renderView()->minPrefWidth();
+ return m_frame->document()->renderView()->minPreferredLogicalWidth();
return 0;
}
@@ -553,13 +685,18 @@ void WebFrameImpl::forms(WebVector<WebFormElement>& results) const
return;
RefPtr<HTMLCollection> forms = m_frame->document()->forms();
- size_t formCount = forms->length();
+ size_t formCount = 0;
+ for (size_t i = 0; i < forms->length(); ++i) {
+ Node* node = forms->item(i);
+ if (node && node->isHTMLElement())
+ ++formCount;
+ }
WebVector<WebFormElement> temp(formCount);
for (size_t i = 0; i < formCount; ++i) {
Node* node = forms->item(i);
// Strange but true, sometimes item can be 0.
- if (node)
+ if (node && node->isHTMLElement())
temp[i] = static_cast<HTMLFormElement*>(node);
}
results.swap(temp);
@@ -570,6 +707,14 @@ WebAnimationController* WebFrameImpl::animationController()
return &m_animationController;
}
+WebPerformance WebFrameImpl::performance() const
+{
+ if (!m_frame || !m_frame->domWindow())
+ return WebPerformance();
+
+ return WebPerformance(m_frame->domWindow()->webkitPerformance());
+}
+
WebSecurityOrigin WebFrameImpl::securityOrigin() const
{
if (!m_frame || !m_frame->document())
@@ -596,7 +741,7 @@ NPObject* WebFrameImpl::windowObject() const
void WebFrameImpl::bindToWindowObject(const WebString& name, NPObject* object)
{
ASSERT(m_frame);
- if (!m_frame || !m_frame->script()->canExecuteScripts())
+ if (!m_frame || !m_frame->script()->canExecuteScripts(NotAboutToExecuteScript))
return;
String key = name;
@@ -609,8 +754,9 @@ void WebFrameImpl::bindToWindowObject(const WebString& name, NPObject* object)
void WebFrameImpl::executeScript(const WebScriptSource& source)
{
+ TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::base());
m_frame->script()->executeScript(
- ScriptSourceCode(source.code, source.url, source.startLine));
+ ScriptSourceCode(source.code, source.url, position));
}
void WebFrameImpl::executeScriptInIsolatedWorld(
@@ -620,8 +766,9 @@ void WebFrameImpl::executeScriptInIsolatedWorld(
Vector<ScriptSourceCode> sources;
for (unsigned i = 0; i < numSources; ++i) {
+ TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(sourcesIn[i].startLine), WTF::OneBasedNumber::base());
sources.append(ScriptSourceCode(
- sourcesIn[i].code, sourcesIn[i].url, sourcesIn[i].startLine));
+ sourcesIn[i].code, sourcesIn[i].url, position));
}
m_frame->script()->evaluateInIsolatedWorld(worldId, sources, extensionGroup);
@@ -670,6 +817,14 @@ void WebFrameImpl::collectGarbage()
}
#if USE(V8)
+v8::Handle<v8::Value> WebFrameImpl::executeScriptAndReturnValue(
+ const WebScriptSource& source)
+{
+ TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::base());
+ return m_frame->script()->executeScript(
+ ScriptSourceCode(source.code, source.url, position)).v8Value();
+}
+
// Returns the V8 context for this frame, or an empty handle if there is none.
v8::Local<v8::Context> WebFrameImpl::mainWorldScriptContext() const
{
@@ -694,7 +849,7 @@ bool WebFrameImpl::insertStyleText(
if (!id.isEmpty()) {
Element* oldElement = document->getElementById(id);
if (oldElement) {
- Node* parent = oldElement->parent();
+ Node* parent = oldElement->parentNode();
if (!parent)
return false;
parent->removeChild(oldElement, err);
@@ -713,12 +868,10 @@ bool WebFrameImpl::insertStyleText(
return success;
}
-void WebFrameImpl::reload()
+void WebFrameImpl::reload(bool ignoreCache)
{
m_frame->loader()->history()->saveDocumentAndScrollState();
-
- stopLoading(); // Make sure existing activity stops.
- m_frame->loader()->reload();
+ m_frame->loader()->reload(ignoreCache);
}
void WebFrameImpl::loadRequest(const WebURLRequest& request)
@@ -731,7 +884,6 @@ void WebFrameImpl::loadRequest(const WebURLRequest& request)
return;
}
- stopLoading(); // Make sure existing activity stops.
m_frame->loader()->load(resourceRequest, false);
}
@@ -740,8 +892,6 @@ void WebFrameImpl::loadHistoryItem(const WebHistoryItem& item)
RefPtr<HistoryItem> historyItem = PassRefPtr<HistoryItem>(item);
ASSERT(historyItem.get());
- stopLoading(); // Make sure existing activity stops.
-
// If there is no currentItem, which happens when we are navigating in
// session history after a crash, we need to manufacture one otherwise WebKit
// hoarks. This is probably the wrong thing to do, but it seems to work.
@@ -778,8 +928,6 @@ void WebFrameImpl::loadData(const WebData& data,
request = m_frame->loader()->originalRequest();
request.setURL(baseURL);
- stopLoading(); // Make sure existing activity stops.
-
m_frame->loader()->load(request, substData, false);
if (replace) {
// Do this to force WebKit to treat the load as replacing the currently
@@ -842,12 +990,17 @@ WebHistoryItem WebFrameImpl::previousHistoryItem() const
// only get saved to history when it becomes the previous item. The caller
// is expected to query the history item after a navigation occurs, after
// the desired history item has become the previous entry.
- return WebHistoryItem(viewImpl()->previousHistoryItem());
+ return WebHistoryItem(m_frame->loader()->history()->previousItem());
}
WebHistoryItem WebFrameImpl::currentHistoryItem() const
{
- m_frame->loader()->history()->saveDocumentAndScrollState();
+ // If we are still loading, then we don't want to clobber the current
+ // history item as this could cause us to lose the scroll position and
+ // document state. However, it is OK for new navigations.
+ if (m_frame->loader()->loadType() == FrameLoadTypeStandard
+ || !m_frame->loader()->activeDocumentLoader()->isLoadingInAPISense())
+ m_frame->loader()->history()->saveDocumentAndScrollState();
return WebHistoryItem(m_frame->page()->backForwardList()->currentItem());
}
@@ -885,22 +1038,14 @@ void WebFrameImpl::dispatchWillSendRequest(WebURLRequest& request)
0, 0, request.toMutableResourceRequest(), response);
}
-void WebFrameImpl::commitDocumentData(const char* data, size_t dataLen)
+WebURLLoader* WebFrameImpl::createAssociatedURLLoader()
{
- DocumentLoader* documentLoader = m_frame->loader()->documentLoader();
-
- // Set the text encoding. This calls begin() for us. It is safe to call
- // this multiple times (Mac does: page/mac/WebCoreFrameBridge.mm).
- bool userChosen = true;
- String encoding = documentLoader->overrideEncoding();
- if (encoding.isNull()) {
- userChosen = false;
- encoding = documentLoader->response().textEncodingName();
- }
- m_frame->loader()->setEncoding(encoding, userChosen);
+ return new AssociatedURLLoader(this);
+}
- // NOTE: mac only does this if there is a document
- m_frame->loader()->addData(data, dataLen);
+void WebFrameImpl::commitDocumentData(const char* data, size_t length)
+{
+ m_frame->loader()->documentLoader()->commitData(data, length);
}
unsigned WebFrameImpl::unloadListenerCount() const
@@ -957,6 +1102,22 @@ WebRange WebFrameImpl::markedRange() const
return frame()->editor()->compositionRange();
}
+bool WebFrameImpl::firstRectForCharacterRange(unsigned location, unsigned length, WebRect& rect) const
+{
+ if ((location + length < location) && (location + length))
+ length = 0;
+
+ Element* selectionRoot = frame()->selection()->rootEditableElement();
+ Element* scope = selectionRoot ? selectionRoot : frame()->document()->documentElement();
+ RefPtr<Range> range = TextIterator::rangeFromLocationAndLength(scope, location, length);
+ if (!range)
+ return false;
+ IntRect intRect = frame()->editor()->firstRectForRange(range.get());
+ rect = WebRect(intRect.x(), intRect.y(), intRect.width(), intRect.height());
+
+ return true;
+}
+
bool WebFrameImpl::executeCommand(const WebString& name)
{
ASSERT(frame());
@@ -975,17 +1136,25 @@ bool WebFrameImpl::executeCommand(const WebString& name)
if (command[command.length() - 1] == UChar(':'))
command = command.substring(0, command.length() - 1);
+ if (command == "Copy") {
+ WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
+ if (pluginContainer) {
+ pluginContainer->copy();
+ return true;
+ }
+ }
+
bool rv = true;
// Specially handling commands that Editor::execCommand does not directly
// support.
if (command == "DeleteToEndOfParagraph") {
Editor* editor = frame()->editor();
- if (!editor->deleteWithDirection(SelectionController::FORWARD,
+ if (!editor->deleteWithDirection(SelectionController::DirectionForward,
ParagraphBoundary,
true,
false)) {
- editor->deleteWithDirection(SelectionController::FORWARD,
+ editor->deleteWithDirection(SelectionController::DirectionForward,
CharacterGranularity,
true,
false);
@@ -1045,6 +1214,10 @@ bool WebFrameImpl::isContinuousSpellCheckingEnabled() const
bool WebFrameImpl::hasSelection() const
{
+ WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
+ if (pluginContainer)
+ return pluginContainer->plugin()->hasSelection();
+
// frame()->selection()->isNone() never returns true.
return (frame()->selection()->start() != frame()->selection()->end());
}
@@ -1056,6 +1229,10 @@ WebRange WebFrameImpl::selectionRange() const
WebString WebFrameImpl::selectionAsText() const
{
+ WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
+ if (pluginContainer)
+ return pluginContainer->plugin()->selectionAsText();
+
RefPtr<Range> range = frame()->selection()->toNormalizedRange();
if (!range.get())
return WebString();
@@ -1070,6 +1247,10 @@ WebString WebFrameImpl::selectionAsText() const
WebString WebFrameImpl::selectionAsMarkup() const
{
+ WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
+ if (pluginContainer)
+ return pluginContainer->plugin()->selectionAsMarkup();
+
RefPtr<Range> range = frame()->selection()->toNormalizedRange();
if (!range.get())
return WebString();
@@ -1082,11 +1263,10 @@ void WebFrameImpl::selectWordAroundPosition(Frame* frame, VisiblePosition pos)
VisibleSelection selection(pos);
selection.expandUsingGranularity(WordGranularity);
- if (selection.isRange())
- frame->setSelectionGranularity(WordGranularity);
-
- if (frame->shouldChangeSelection(selection))
- frame->selection()->setSelection(selection);
+ if (frame->selection()->shouldChangeSelection(selection)) {
+ TextGranularity granularity = selection.isRange() ? WordGranularity : CharacterGranularity;
+ frame->selection()->setSelection(selection, granularity);
+ }
}
bool WebFrameImpl::selectWordAroundCaret()
@@ -1099,18 +1279,27 @@ bool WebFrameImpl::selectWordAroundCaret()
return true;
}
-int WebFrameImpl::printBegin(const WebSize& pageSize)
+int WebFrameImpl::printBegin(const WebSize& pageSize, int printerDPI, bool *useBrowserOverlays)
{
ASSERT(!frame()->document()->isFrameSet());
+ // If this is a plugin document, check if the plugin supports its own
+ // printing. If it does, we will delegate all printing to that.
+ WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
+ if (pluginContainer && pluginContainer->supportsPaginatedPrint())
+ m_printContext.set(new ChromePluginPrintContext(frame(), printerDPI));
+ else
+ m_printContext.set(new ChromePrintContext(frame()));
- m_printContext.set(new ChromePrintContext(frame()));
FloatRect rect(0, 0, static_cast<float>(pageSize.width),
static_cast<float>(pageSize.height));
- m_printContext->begin(rect.width());
+ m_printContext->begin(rect.width(), rect.height());
float pageHeight;
// We ignore the overlays calculation for now since they are generated in the
// browser. pageHeight is actually an output parameter.
m_printContext->computePageRects(rect, 0, 0, 1.0, pageHeight);
+ if (useBrowserOverlays)
+ *useBrowserOverlays = m_printContext->shouldUseBrowserOverlays();
+
return m_printContext->pageCount();
}
@@ -1133,7 +1322,7 @@ float WebFrameImpl::printPage(int page, WebCanvas* canvas)
return 0;
}
-#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD)
+#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) || OS(SOLARIS)
PlatformContextSkia context(canvas);
GraphicsContext spool(&context);
#elif OS(DARWIN)
@@ -1152,6 +1341,28 @@ void WebFrameImpl::printEnd()
m_printContext.clear();
}
+bool WebFrameImpl::isPageBoxVisible(int pageIndex)
+{
+ return frame()->document()->isPageBoxVisible(pageIndex);
+}
+
+void WebFrameImpl::pageSizeAndMarginsInPixels(int pageIndex,
+ WebSize& pageSize,
+ int& marginTop,
+ int& marginRight,
+ int& marginBottom,
+ int& marginLeft)
+{
+ IntSize size(pageSize.width, pageSize.height);
+ frame()->document()->pageSizeAndMarginsInPixels(pageIndex,
+ size,
+ marginTop,
+ marginRight,
+ marginBottom,
+ marginLeft);
+ pageSize = size;
+}
+
bool WebFrameImpl::find(int identifier,
const WebString& searchText,
const WebFindOptions& options,
@@ -1163,7 +1374,7 @@ bool WebFrameImpl::find(int identifier,
if (!options.findNext)
frame()->page()->unmarkAllTextMatches();
else
- setMarkerActive(m_activeMatch.get(), false); // Active match is changing.
+ setMarkerActive(m_activeMatch.get(), false); // Active match is changing.
// Starts the search from the current selection.
bool startInSelection = true;
@@ -1179,7 +1390,7 @@ bool WebFrameImpl::find(int identifier,
}
ASSERT(frame() && frame()->view());
- bool found = frame()->findString(
+ bool found = frame()->editor()->findString(
searchText, options.forward, options.matchCase, wrapWithinFrame,
startInSelection);
if (found) {
@@ -1203,11 +1414,14 @@ bool WebFrameImpl::find(int identifier,
else {
m_activeMatch = newSelection.toNormalizedRange();
currSelectionRect = m_activeMatch->boundingBox();
- setMarkerActive(m_activeMatch.get(), true); // Active.
+ setMarkerActive(m_activeMatch.get(), true); // Active.
// WebKit draws the highlighting for all matches.
executeCommand(WebString::fromUTF8("Unselect"));
}
+ // Make sure no node is focused. See http://crbug.com/38700.
+ frame()->document()->setFocusedNode(0);
+
if (!options.findNext || activeSelection) {
// This is either a Find operation or a Find-next from a new start point
// due to a selection, so we set the flag to ask the scoping effort
@@ -1258,8 +1472,8 @@ void WebFrameImpl::stopFinding(bool clearSelection)
cancelPendingScopingEffort();
// Remove all markers for matches found and turn off the highlighting.
- frame()->document()->removeMarkers(DocumentMarker::TextMatch);
- frame()->setMarkedTextMatchesAreHighlighted(false);
+ frame()->document()->markers()->removeMarkers(DocumentMarker::TextMatch);
+ frame()->editor()->setMarkedTextMatchesAreHighlighted(false);
// Let the frame know that we don't want tickmarks or highlighting anymore.
invalidateArea(InvalidateAll);
@@ -1280,7 +1494,7 @@ void WebFrameImpl::scopeStringMatches(int identifier,
// Scoping is just about to begin.
m_scopingComplete = false;
// Clear highlighting for this frame.
- if (frame()->markedTextMatchesAreHighlighted())
+ if (frame()->editor()->markedTextMatchesAreHighlighted())
frame()->page()->unmarkAllTextMatches();
// Clear the counters from last operation.
m_lastMatchCount = 0;
@@ -1295,7 +1509,7 @@ void WebFrameImpl::scopeStringMatches(int identifier,
identifier,
searchText,
options,
- false); // false=we just reset, so don't do it again.
+ false); // false=we just reset, so don't do it again.
return;
}
@@ -1309,7 +1523,7 @@ void WebFrameImpl::scopeStringMatches(int identifier,
m_resumeScopingFromRange->startOffset(ec2) + 1,
ec);
if (ec || ec2) {
- if (ec2) // A non-zero |ec| happens when navigating during search.
+ if (ec2) // A non-zero |ec| happens when navigating during search.
ASSERT_NOT_REACHED();
return;
}
@@ -1318,7 +1532,7 @@ void WebFrameImpl::scopeStringMatches(int identifier,
// This timeout controls how long we scope before releasing control. This
// value does not prevent us from running for longer than this, but it is
// periodically checked to see if we have exceeded our allocated time.
- const double maxScopingDuration = 0.1; // seconds
+ const double maxScopingDuration = 0.1; // seconds
int matchCount = 0;
bool timedOut = false;
@@ -1405,7 +1619,7 @@ void WebFrameImpl::scopeStringMatches(int identifier,
m_lastSearchString = searchText;
if (matchCount > 0) {
- frame()->setMarkedTextMatchesAreHighlighted(true);
+ frame()->editor()->setMarkedTextMatchesAreHighlighted(true);
m_lastMatchCount += matchCount;
@@ -1425,8 +1639,8 @@ void WebFrameImpl::scopeStringMatches(int identifier,
identifier,
searchText,
options,
- false); // don't reset.
- return; // Done for now, resume work later.
+ false); // don't reset.
+ return; // Done for now, resume work later.
}
// This frame has no further scoping left, so it is done. Other frames might,
@@ -1478,14 +1692,6 @@ void WebFrameImpl::resetMatchCount()
m_framesScopingCount = 0;
}
-WebURL WebFrameImpl::completeURL(const WebString& url) const
-{
- if (!m_frame || !m_frame->document())
- return WebURL();
-
- return m_frame->document()->completeURL(url);
-}
-
WebString WebFrameImpl::contentAsText(size_t maxChars) const
{
if (!m_frame)
@@ -1518,6 +1724,11 @@ WebString WebFrameImpl::counterValueForElementById(const WebString& id) const
return counterValueForElement(element);
}
+WebString WebFrameImpl::markerTextForListItem(const WebElement& webElement) const
+{
+ return WebCore::markerTextForListItem(const_cast<Element*>(webElement.constUnwrap<Element>()));
+}
+
int WebFrameImpl::pageNumberForElementById(const WebString& id,
float pageWidthInPixels,
float pageHeightInPixels) const
@@ -1533,6 +1744,48 @@ int WebFrameImpl::pageNumberForElementById(const WebString& id,
return PrintContext::pageNumberForElement(element, pageSize);
}
+WebRect WebFrameImpl::selectionBoundsRect() const
+{
+ if (hasSelection())
+ return IntRect(frame()->selection()->bounds(false));
+
+ return WebRect();
+}
+
+bool WebFrameImpl::selectionStartHasSpellingMarkerFor(int from, int length) const
+{
+ if (!m_frame)
+ return false;
+ return m_frame->editor()->selectionStartHasSpellingMarkerFor(from, length);
+}
+
+bool WebFrameImpl::pauseSVGAnimation(const WebString& animationId, double time, const WebString& elementId)
+{
+#if !ENABLE(SVG)
+ return false;
+#else
+ if (!m_frame)
+ return false;
+
+ Document* document = m_frame->document();
+ if (!document || !document->svgExtensions())
+ return false;
+
+ Node* coreNode = document->getElementById(animationId);
+ if (!coreNode || !SVGSMILElement::isSMILElement(coreNode))
+ return false;
+
+ return document->accessSVGExtensions()->sampleAnimationAtTime(elementId, static_cast<SVGSMILElement*>(coreNode), time);
+#endif
+}
+
+WebString WebFrameImpl::layerTreeAsText() const
+{
+ if (!m_frame)
+ return WebString();
+ return WebString(m_frame->layerTreeAsText());
+}
+
// WebFrameImpl public ---------------------------------------------------------
PassRefPtr<WebFrameImpl> WebFrameImpl::create(WebFrameClient* client)
@@ -1553,6 +1806,7 @@ WebFrameImpl::WebFrameImpl(WebFrameClient* client)
, m_scopingComplete(false)
, m_nextInvalidateAfter(0)
, m_animationController(this)
+ , m_identifier(generateFrameIdentifier())
{
ChromiumBridge::incrementStatsCounter(webFrameActiveCount);
frameCount++;
@@ -1608,7 +1862,7 @@ PassRefPtr<Frame> WebFrameImpl::createChildFrame(
// it is necessary to check the value after calling init() and
// return without loading URL.
// (b:791612)
- childFrame->init(); // create an empty document
+ childFrame->init(); // create an empty document
if (!childFrame->tree()->parent())
return 0;
@@ -1631,14 +1885,26 @@ void WebFrameImpl::layout()
// layout this frame
FrameView* view = m_frame->view();
if (view)
- view->layoutIfNeededRecursive();
+ view->updateLayoutAndStyleIfNeededRecursive();
+}
+
+void WebFrameImpl::paintWithContext(GraphicsContext& gc, const WebRect& rect)
+{
+ IntRect dirtyRect(rect);
+ gc.save();
+ if (m_frame->document() && frameView()) {
+ gc.clip(dirtyRect);
+ frameView()->paint(&gc, dirtyRect);
+ m_frame->page()->inspectorController()->drawNodeHighlight(gc);
+ } else
+ gc.fillRect(dirtyRect, Color::white, ColorSpaceDeviceRGB);
+ gc.restore();
}
void WebFrameImpl::paint(WebCanvas* canvas, const WebRect& rect)
{
if (rect.isEmpty())
return;
- IntRect dirtyRect(rect);
#if WEBKIT_USING_CG
GraphicsContext gc(canvas);
LocalCurrentGraphicsContext localContext(&gc);
@@ -1650,14 +1916,7 @@ void WebFrameImpl::paint(WebCanvas* canvas, const WebRect& rect)
#else
notImplemented();
#endif
- gc.save();
- if (m_frame->document() && frameView()) {
- gc.clip(dirtyRect);
- frameView()->paint(&gc, dirtyRect);
- m_frame->page()->inspectorController()->drawNodeHighlight(gc);
- } else
- gc.fillRect(dirtyRect, Color::white, DeviceColorSpace);
- gc.restore();
+ paintWithContext(gc, rect);
}
void WebFrameImpl::createFrameView()
@@ -1719,7 +1978,7 @@ WebFrameImpl* WebFrameImpl::fromFrameOwnerElement(Element* element)
static_cast<HTMLFrameOwnerElement*>(element);
return fromFrame(frameElement->contentFrame());
}
-
+
WebViewImpl* WebFrameImpl::viewImpl() const
{
if (!m_frame)
@@ -1753,7 +2012,7 @@ void WebFrameImpl::setFindEndstateFocusAndSelection()
// example, focus links if we have found text within the link.
Node* node = m_activeMatch->firstNode();
while (node && !node->isFocusable() && node != frame()->document())
- node = node->parent();
+ node = node->parentNode();
if (node && node != frame()->document()) {
// Found a focusable parent node. Set focus to it.
@@ -1794,24 +2053,38 @@ void WebFrameImpl::didFail(const ResourceError& error, bool wasProvisional)
client()->didFailLoad(this, webError);
}
-void WebFrameImpl::setAllowsScrolling(bool flag)
+void WebFrameImpl::setCanHaveScrollbars(bool canHaveScrollbars)
{
- m_frame->view()->setCanHaveScrollbars(flag);
+ m_frame->view()->setCanHaveScrollbars(canHaveScrollbars);
}
-void WebFrameImpl::registerPasswordListener(
+bool WebFrameImpl::registerPasswordListener(
WebInputElement inputElement,
WebPasswordAutocompleteListener* listener)
{
- RefPtr<HTMLInputElement> element = inputElement.operator PassRefPtr<HTMLInputElement>();
- ASSERT(m_passwordListeners.find(element) == m_passwordListeners.end());
- m_passwordListeners.set(element, listener);
+ RefPtr<HTMLInputElement> element(inputElement.unwrap<HTMLInputElement>());
+ if (!m_passwordListeners.add(element, listener).second) {
+ delete listener;
+ return false;
+ }
+ return true;
+}
+
+void WebFrameImpl::notifiyPasswordListenerOfAutocomplete(
+ const WebInputElement& inputElement)
+{
+ const HTMLInputElement* element = inputElement.constUnwrap<HTMLInputElement>();
+ WebPasswordAutocompleteListener* listener = getPasswordListener(element);
+ // Password listeners need to autocomplete other fields that depend on the
+ // input element with autofill suggestions.
+ if (listener)
+ listener->performInlineAutocomplete(element->value(), false, false);
}
WebPasswordAutocompleteListener* WebFrameImpl::getPasswordListener(
- HTMLInputElement* inputElement)
+ const HTMLInputElement* inputElement)
{
- return m_passwordListeners.get(RefPtr<HTMLInputElement>(inputElement));
+ return m_passwordListeners.get(RefPtr<HTMLInputElement>(const_cast<HTMLInputElement*>(inputElement)));
}
// WebFrameImpl private --------------------------------------------------------
@@ -1832,6 +2105,8 @@ void WebFrameImpl::invalidateArea(AreaToInvalidate area)
if ((area & InvalidateContentArea) == InvalidateContentArea) {
IntRect contentArea(
view->x(), view->y(), view->visibleWidth(), view->visibleHeight());
+ IntRect frameRect = view->frameRect();
+ contentArea.move(-frameRect.topLeft().x(), -frameRect.topLeft().y());
view->invalidateRect(contentArea);
}
@@ -1841,6 +2116,8 @@ void WebFrameImpl::invalidateArea(AreaToInvalidate area)
view->x() + view->visibleWidth(), view->y(),
ScrollbarTheme::nativeTheme()->scrollbarThickness(),
view->visibleHeight());
+ IntRect frameRect = view->frameRect();
+ scrollBarVert.move(-frameRect.topLeft().x(), -frameRect.topLeft().y());
view->invalidateRect(scrollBarVert);
}
}
@@ -1866,14 +2143,14 @@ void WebFrameImpl::addMarker(Range* range, bool activeMatch)
if (marker.endOffset > marker.startOffset) {
// Find the node to add a marker to and add it.
Node* node = textPiece->startContainer(exception);
- frame()->document()->addMarker(node, marker);
+ frame()->document()->markers()->addMarker(node, marker);
// Rendered rects for markers in WebKit are not populated until each time
// the markers are painted. However, we need it to happen sooner, because
// the whole purpose of tickmarks on the scrollbar is to show where
// matches off-screen are (that haven't been painted yet).
- Vector<DocumentMarker> markers = frame()->document()->markersForNode(node);
- frame()->document()->setRenderedRectForMarker(
+ Vector<DocumentMarker> markers = frame()->document()->markers()->markersForNode(node);
+ frame()->document()->markers()->setRenderedRectForMarker(
textPiece->startContainer(exception),
markers[markers.size() - 1],
range->boundingBox());
@@ -1883,10 +2160,11 @@ void WebFrameImpl::addMarker(Range* range, bool activeMatch)
void WebFrameImpl::setMarkerActive(Range* range, bool active)
{
- if (!range)
+ WebCore::ExceptionCode ec;
+ if (!range || range->collapsed(ec))
return;
- frame()->document()->setMarkersActive(range, active);
+ frame()->document()->markers()->setMarkersActive(range, active);
}
int WebFrameImpl::ordinalOfFirstMatchForFrame(WebFrameImpl* frame) const
@@ -1906,9 +2184,9 @@ int WebFrameImpl::ordinalOfFirstMatchForFrame(WebFrameImpl* frame) const
bool WebFrameImpl::shouldScopeMatches(const String& searchText)
{
- // Don't scope if we can't find a frame or if the frame is not visible.
+ // Don't scope if we can't find a frame or a view or if the frame is not visible.
// The user may have closed the tab/application, so abort.
- if (!frame() || !hasVisibleContent())
+ if (!frame() || !frame()->view() || !hasVisibleContent())
return false;
ASSERT(frame()->document() && frame()->view());
@@ -1922,7 +2200,7 @@ bool WebFrameImpl::shouldScopeMatches(const String& searchText)
searchText.substring(0, m_lastSearchString.length());
if (previousSearchPrefix == m_lastSearchString)
- return false; // Don't search this frame, it will be fruitless.
+ return false; // Don't search this frame, it will be fruitless.
}
return true;
@@ -1974,12 +2252,13 @@ void WebFrameImpl::clearPasswordListeners()
void WebFrameImpl::loadJavaScriptURL(const KURL& url)
{
- // This is copied from FrameLoader::executeIfJavaScriptURL. Unfortunately,
- // we cannot just use that method since it is private, and it also doesn't
- // quite behave as we require it to for bookmarklets. The key difference is
- // that we need to suppress loading the string result from evaluating the JS
- // URL if executing the JS URL resulted in a location change. We also allow
- // a JS URL to be loaded even if scripts on the page are otherwise disabled.
+ // This is copied from ScriptController::executeIfJavaScriptURL.
+ // Unfortunately, we cannot just use that method since it is private, and
+ // it also doesn't quite behave as we require it to for bookmarklets. The
+ // key difference is that we need to suppress loading the string result
+ // from evaluating the JS URL if executing the JS URL resulted in a
+ // location change. We also allow a JS URL to be loaded even if scripts on
+ // the page are otherwise disabled.
if (!m_frame->document() || !m_frame->page())
return;
@@ -1991,14 +2270,8 @@ void WebFrameImpl::loadJavaScriptURL(const KURL& url)
if (!result.getString(scriptResult))
return;
- SecurityOrigin* securityOrigin = m_frame->document()->securityOrigin();
-
- if (!m_frame->redirectScheduler()->locationChangePending()) {
- m_frame->loader()->stopAllLoaders();
- m_frame->loader()->begin(m_frame->loader()->url(), true, securityOrigin);
- m_frame->loader()->write(scriptResult);
- m_frame->loader()->end();
- }
+ if (!m_frame->navigationScheduler()->locationChangePending())
+ m_frame->loader()->writer()->replaceDocument(scriptResult);
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebFrameImpl.h b/WebKit/chromium/src/WebFrameImpl.h
index ccba6d4..52d9db4 100644
--- a/WebKit/chromium/src/WebFrameImpl.h
+++ b/WebKit/chromium/src/WebFrameImpl.h
@@ -31,17 +31,17 @@
#ifndef WebFrameImpl_h
#define WebFrameImpl_h
-// FIXME: remove this relative path once consumers from glue are removed.
-#include "../public/WebFrame.h"
+#include "WebAnimationControllerImpl.h"
+#include "WebFrame.h"
+
#include "Frame.h"
#include "FrameLoaderClientImpl.h"
#include "PlatformString.h"
#include <wtf/OwnPtr.h>
#include <wtf/RefCounted.h>
-#include "WebAnimationControllerImpl.h"
-
namespace WebCore {
+class GraphicsContext;
class HistoryItem;
class KURL;
class Node;
@@ -56,6 +56,8 @@ class WebDataSourceImpl;
class WebInputElement;
class WebFrameClient;
class WebPasswordAutocompleteListener;
+class WebPerformance;
+class WebPluginContainerImpl;
class WebView;
class WebViewImpl;
@@ -64,7 +66,8 @@ class WebFrameImpl : public WebFrame, public RefCounted<WebFrameImpl> {
public:
// WebFrame methods:
virtual WebString name() const;
- virtual void clearName();
+ virtual void setName(const WebString&);
+ virtual long long identifier() const;
virtual WebURL url() const;
virtual WebURL favIconURL() const;
virtual WebURL openSearchDescriptionURL() const;
@@ -88,7 +91,8 @@ public:
virtual WebFrame* findChildByExpression(const WebString&) const;
virtual WebDocument document() const;
virtual void forms(WebVector<WebFormElement>&) const;
- virtual WebAnimationController* animationController();
+ virtual WebAnimationController* animationController();
+ virtual WebPerformance performance() const;
virtual WebSecurityOrigin securityOrigin() const;
virtual void grantUniversalAccess();
virtual NPObject* windowObject() const;
@@ -100,10 +104,12 @@ public:
virtual void addMessageToConsole(const WebConsoleMessage&);
virtual void collectGarbage();
#if WEBKIT_USING_V8
+ virtual v8::Handle<v8::Value> executeScriptAndReturnValue(
+ const WebScriptSource&);
virtual v8::Local<v8::Context> mainWorldScriptContext() const;
#endif
virtual bool insertStyleText(const WebString& css, const WebString& id);
- virtual void reload();
+ virtual void reload(bool ignoreCache);
virtual void loadRequest(const WebURLRequest&);
virtual void loadHistoryItem(const WebHistoryItem&);
virtual void loadData(
@@ -122,6 +128,7 @@ public:
virtual bool isViewSourceModeEnabled() const;
virtual void setReferrerForRequest(WebURLRequest&, const WebURL& referrer);
virtual void dispatchWillSendRequest(WebURLRequest&);
+ virtual WebURLLoader* createAssociatedURLLoader();
virtual void commitDocumentData(const char* data, size_t length);
virtual unsigned unloadListenerCount() const;
virtual bool isProcessingUserGesture() const;
@@ -132,6 +139,7 @@ public:
virtual void unmarkText();
virtual bool hasMarkedText() const;
virtual WebRange markedRange() const;
+ virtual bool firstRectForCharacterRange(unsigned location, unsigned length, WebRect&) const;
virtual bool executeCommand(const WebString&);
virtual bool executeCommand(const WebString&, const WebString& value);
virtual bool isCommandEnabled(const WebString&) const;
@@ -142,10 +150,18 @@ public:
virtual WebString selectionAsText() const;
virtual WebString selectionAsMarkup() const;
virtual bool selectWordAroundCaret();
- virtual int printBegin(const WebSize& pageSize);
+ virtual int printBegin(const WebSize& pageSize, int printerDPI,
+ bool* useBrowserOverlays);
virtual float printPage(int pageToPrint, WebCanvas*);
virtual float getPrintPageShrink(int page);
virtual void printEnd();
+ virtual bool isPageBoxVisible(int pageIndex);
+ virtual void pageSizeAndMarginsInPixels(int pageIndex,
+ WebSize& pageSize,
+ int& marginTop,
+ int& marginRight,
+ int& marginBottom,
+ int& marginLeft);
virtual bool find(
int identifier, const WebString& searchText, const WebFindOptions&,
bool wrapWithinFrame, WebRect* selectionRect);
@@ -156,17 +172,26 @@ public:
virtual void cancelPendingScopingEffort();
virtual void increaseMatchCount(int count, int identifier);
virtual void resetMatchCount();
- virtual void registerPasswordListener(
+ virtual bool registerPasswordListener(
WebInputElement, WebPasswordAutocompleteListener*);
+ virtual void notifiyPasswordListenerOfAutocomplete(
+ const WebInputElement&);
- virtual WebURL completeURL(const WebString& url) const;
virtual WebString contentAsText(size_t maxChars) const;
virtual WebString contentAsMarkup() const;
virtual WebString renderTreeAsText() const;
virtual WebString counterValueForElementById(const WebString& id) const;
+ virtual WebString markerTextForListItem(const WebElement&) const;
virtual int pageNumberForElementById(const WebString& id,
float pageWidthInPixels,
float pageHeightInPixels) const;
+ virtual WebRect selectionBoundsRect() const;
+
+ virtual bool selectionStartHasSpellingMarkerFor(int from, int length) const;
+ virtual bool pauseSVGAnimation(const WebString& animationId,
+ double time,
+ const WebString& elementId);
+ virtual WebString layerTreeAsText() const;
static PassRefPtr<WebFrameImpl> create(WebFrameClient* client);
~WebFrameImpl();
@@ -179,11 +204,16 @@ public:
void layout();
void paint(WebCanvas*, const WebRect&);
+ void paintWithContext(WebCore::GraphicsContext&, const WebRect&);
void createFrameView();
static WebFrameImpl* fromFrame(WebCore::Frame* frame);
static WebFrameImpl* fromFrameOwnerElement(WebCore::Element* element);
+ // If the frame hosts a PluginDocument, this method returns the WebPluginContainerImpl
+ // that hosts the plugin.
+ static WebPluginContainerImpl* pluginContainerFromFrame(WebCore::Frame*);
+
WebViewImpl* viewImpl() const;
WebCore::Frame* frame() const { return m_frame; }
@@ -212,16 +242,16 @@ public:
// Sets whether the WebFrameImpl allows its document to be scrolled.
// If the parameter is true, allow the document to be scrolled.
// Otherwise, disallow scrolling.
- void setAllowsScrolling(bool);
+ void setCanHaveScrollbars(bool);
// Returns the password autocomplete listener associated with the passed
// user name input element, or 0 if none available.
// Note that the returned listener is owner by the WebFrameImpl and should not
// be kept around as it is deleted when the page goes away.
- WebPasswordAutocompleteListener* getPasswordListener(WebCore::HTMLInputElement*);
+ WebPasswordAutocompleteListener* getPasswordListener(const WebCore::HTMLInputElement*);
WebFrameClient* client() const { return m_client; }
- void dropClient() { m_client = 0; }
+ void setClient(WebFrameClient* client) { m_client = client; }
static void selectWordAroundPosition(WebCore::Frame*, WebCore::VisiblePosition);
@@ -267,7 +297,7 @@ private:
// It is not necessary if the frame is invisible, for example, or if this
// is a repeat search that already returned nothing last time the same prefix
// was searched.
- bool shouldScopeMatches(const WebCore::String& searchText);
+ bool shouldScopeMatches(const WTF::String& searchText);
// Queue up a deferred call to scopeStringMatches.
void scopeStringMatchesSoon(
@@ -318,7 +348,7 @@ private:
// short-circuiting searches in the following scenarios: When a frame has
// been searched and returned 0 results, we don't need to search that frame
// again if the user is just adding to the search (making it more specific).
- WebCore::String m_lastSearchString;
+ WTF::String m_lastSearchString;
// Keeps track of how many matches this frame has found so far, so that we
// don't loose count between scoping efforts, and is also used (in conjunction
@@ -359,6 +389,9 @@ private:
// Keeps a reference to the frame's WebAnimationController.
WebAnimationControllerImpl m_animationController;
+
+ // The identifier of this frame.
+ long long m_identifier;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebGeolocationError.cpp b/WebKit/chromium/src/WebGeolocationError.cpp
new file mode 100644
index 0000000..9acb676
--- /dev/null
+++ b/WebKit/chromium/src/WebGeolocationError.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebGeolocationError.h"
+
+#include "GeolocationError.h"
+#include "WebString.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebGeolocationError::assign(Error code, const WebString& message)
+{
+ m_private = GeolocationError::create(static_cast<GeolocationError::ErrorCode>(code), message);
+}
+
+void WebGeolocationError::assign(const WebGeolocationError& other)
+{
+ m_private = other.m_private;
+}
+
+void WebGeolocationError::reset()
+{
+ m_private.reset();
+}
+
+WebGeolocationError::WebGeolocationError(PassRefPtr<GeolocationError> error)
+{
+ m_private = error;
+}
+
+WebGeolocationError& WebGeolocationError::operator=(PassRefPtr<GeolocationError> error)
+{
+ m_private = error;
+ return *this;
+}
+
+WebGeolocationError::operator PassRefPtr<GeolocationError>() const
+{
+ return m_private.get();
+}
+
+}
diff --git a/WebKit/chromium/src/WebGeolocationPosition.cpp b/WebKit/chromium/src/WebGeolocationPosition.cpp
new file mode 100644
index 0000000..75b3306
--- /dev/null
+++ b/WebKit/chromium/src/WebGeolocationPosition.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebGeolocationPosition.h"
+
+#include "GeolocationPosition.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebGeolocationPosition::assign(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+{
+ m_private = GeolocationPosition::create(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed);
+}
+
+void WebGeolocationPosition::assign(const WebGeolocationPosition& other)
+{
+ m_private = other.m_private;
+}
+
+void WebGeolocationPosition::reset()
+{
+ m_private.reset();
+}
+
+WebGeolocationPosition& WebGeolocationPosition::operator=(PassRefPtr<GeolocationPosition> position)
+{
+ m_private = position;
+ return *this;
+}
+
+WebGeolocationPosition::operator PassRefPtr<GeolocationPosition>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp b/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp
new file mode 100644
index 0000000..bbc852f
--- /dev/null
+++ b/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebGeolocationServiceBridgeImpl.h"
+
+#include "Chrome.h"
+#include "ChromeClientImpl.h"
+#include "Frame.h"
+#include "Geolocation.h"
+#include "GeolocationServiceChromium.h"
+#include "Geoposition.h"
+#include "Page.h"
+#include "PositionError.h"
+#include "PositionOptions.h"
+#include "WebFrame.h"
+#include "WebFrameImpl.h"
+#include "WebGeolocationService.h"
+#include "WebGeolocationServiceBridge.h"
+#include "WebViewClient.h"
+#include "WebViewImpl.h"
+
+#if ENABLE(GEOLOCATION)
+
+using WebCore::Coordinates;
+using WebCore::Frame;
+using WebCore::Geolocation;
+using WebCore::GeolocationServiceBridge;
+using WebCore::GeolocationServiceChromium;
+using WebCore::GeolocationServiceClient;
+using WebCore::Geoposition;
+using WebCore::PositionError;
+using WebCore::PositionOptions;
+using WTF::String;
+
+namespace WebKit {
+
+class WebGeolocationServiceBridgeImpl : public GeolocationServiceBridge, public WebGeolocationServiceBridge {
+public:
+ explicit WebGeolocationServiceBridgeImpl(GeolocationServiceChromium*);
+ virtual ~WebGeolocationServiceBridgeImpl();
+
+ // GeolocationServiceBridge
+ virtual bool startUpdating(PositionOptions*);
+ virtual void stopUpdating();
+ virtual void suspend();
+ virtual void resume();
+ virtual int getBridgeId() const;
+ virtual void attachBridgeIfNeeded();
+
+ // WebGeolocationServiceBridge
+ virtual void setIsAllowed(bool allowed);
+ virtual void setLastPosition(double latitude, double longitude, bool providesAltitude, double altitude, double accuracy, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed, long long timestamp);
+ virtual void setLastError(int errorCode, const WebString& message);
+ virtual void didDestroyGeolocationService();
+
+private:
+ bool isAttached() const;
+ // Pointer back to the WebKit geolocation client. We obtain this via the frame's page, but need to cache it
+ // as it may still be alive after the page has detached from the frame.
+ WebGeolocationService* m_webGeolocationService;
+ // GeolocationServiceChromium owns us, we only have a pointer back to it.
+ GeolocationServiceChromium* m_geolocationServiceChromium;
+ int m_bridgeId;
+};
+
+GeolocationServiceBridge* createGeolocationServiceBridgeImpl(GeolocationServiceChromium* geolocationServiceChromium)
+{
+ return new WebGeolocationServiceBridgeImpl(geolocationServiceChromium);
+}
+
+WebGeolocationServiceBridgeImpl::WebGeolocationServiceBridgeImpl(GeolocationServiceChromium* geolocationServiceChromium)
+ : m_webGeolocationService(0)
+ , m_geolocationServiceChromium(geolocationServiceChromium)
+ , m_bridgeId(0)
+{
+}
+
+WebGeolocationServiceBridgeImpl::~WebGeolocationServiceBridgeImpl()
+{
+ if (isAttached())
+ m_webGeolocationService->detachBridge(m_bridgeId);
+}
+
+bool WebGeolocationServiceBridgeImpl::startUpdating(PositionOptions* positionOptions)
+{
+ attachBridgeIfNeeded();
+ if (!isAttached())
+ return false;
+ m_webGeolocationService->startUpdating(m_bridgeId, m_geolocationServiceChromium->frame()->document()->url(), positionOptions->enableHighAccuracy());
+ return true;
+}
+
+void WebGeolocationServiceBridgeImpl::stopUpdating()
+{
+ if (isAttached()) {
+ m_webGeolocationService->stopUpdating(m_bridgeId);
+ m_webGeolocationService->detachBridge(m_bridgeId);
+ m_bridgeId = 0;
+ m_webGeolocationService = 0;
+ }
+}
+
+void WebGeolocationServiceBridgeImpl::suspend()
+{
+ if (isAttached())
+ m_webGeolocationService->suspend(m_bridgeId);
+}
+
+void WebGeolocationServiceBridgeImpl::resume()
+{
+ if (isAttached())
+ m_webGeolocationService->resume(m_bridgeId);
+}
+
+int WebGeolocationServiceBridgeImpl::getBridgeId() const
+{
+ return m_bridgeId;
+}
+
+void WebGeolocationServiceBridgeImpl::attachBridgeIfNeeded()
+{
+ if (isAttached())
+ return;
+ // Lazy attach to the geolocation service of the associated page if there is one.
+ Frame* frame = m_geolocationServiceChromium->frame();
+ if (!frame || !frame->page())
+ return;
+ WebKit::ChromeClientImpl* chromeClientImpl = static_cast<WebKit::ChromeClientImpl*>(frame->page()->chrome()->client());
+ WebKit::WebViewClient* webViewClient = chromeClientImpl->webView()->client();
+ m_webGeolocationService = webViewClient->geolocationService();
+ ASSERT(m_webGeolocationService);
+ m_bridgeId = m_webGeolocationService->attachBridge(this);
+ if (!m_bridgeId) {
+ // Attach failed. Release association with this service.
+ m_webGeolocationService = 0;
+ }
+}
+
+void WebGeolocationServiceBridgeImpl::setIsAllowed(bool allowed)
+{
+ m_geolocationServiceChromium->setIsAllowed(allowed);
+}
+
+void WebGeolocationServiceBridgeImpl::setLastPosition(double latitude, double longitude, bool providesAltitude, double altitude, double accuracy, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed, long long timestamp)
+{
+ RefPtr<Geoposition> geoposition = Geoposition::create(Coordinates::create(latitude, longitude, providesAltitude, altitude, accuracy, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed), timestamp);
+ m_geolocationServiceChromium->setLastPosition(geoposition);
+}
+
+void WebGeolocationServiceBridgeImpl::setLastError(int errorCode, const WebString& message)
+{
+ m_geolocationServiceChromium->setLastError(errorCode, message);
+}
+
+void WebGeolocationServiceBridgeImpl::didDestroyGeolocationService()
+{
+ m_bridgeId = 0;
+ m_webGeolocationService = 0;
+}
+
+bool WebGeolocationServiceBridgeImpl::isAttached() const
+{
+ // Test the class invariant.
+ if (m_webGeolocationService)
+ ASSERT(m_bridgeId);
+ else
+ ASSERT(!m_bridgeId);
+
+ return m_webGeolocationService;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(GEOLOCATION)
diff --git a/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.h b/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.h
new file mode 100644
index 0000000..2c37bcb
--- /dev/null
+++ b/WebKit/chromium/src/WebGeolocationServiceBridgeImpl.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2010, Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WebGeolocationServiceBridgeImpl_h
+#define WebGeolocationServiceBridgeImpl_h
+
+namespace WebCore {
+class GeolocationServiceBridge;
+class GeolocationServiceChromium;
+}
+
+namespace WebKit {
+WebCore::GeolocationServiceBridge* createGeolocationServiceBridgeImpl(WebCore::GeolocationServiceChromium*);
+} // namespace WebKit
+
+#endif // WebGeolocationServiceBridgeImpl_h
diff --git a/WebKit/chromium/src/WebGeolocationServiceMock.cpp b/WebKit/chromium/src/WebGeolocationServiceMock.cpp
new file mode 100644
index 0000000..07d3f44
--- /dev/null
+++ b/WebKit/chromium/src/WebGeolocationServiceMock.cpp
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebGeolocationServiceMock.h"
+
+#include "GeolocationService.h"
+#include "GeolocationServiceChromium.h"
+#include "GeolocationServiceMock.h"
+#include "WebGeolocationServiceBridge.h"
+#include "WebString.h"
+#include <wtf/CurrentTime.h>
+#include <wtf/HashMap.h>
+#include <wtf/Vector.h>
+
+#if ENABLE(GEOLOCATION)
+
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+// FIXME: Implement mock bindings for client-based geolocation. Ultimately
+// move to another class and remove WebGeolocationService*.
+
+namespace WebKit {
+
+class WebGeolocationServiceMockClientBasedImpl : public WebGeolocationServiceMock {
+};
+
+WebGeolocationServiceMock* WebGeolocationServiceMock::createWebGeolocationServiceMock()
+{
+ return new WebGeolocationServiceMockClientBasedImpl;
+}
+
+void WebGeolocationServiceMock::setMockGeolocationPermission(bool allowed)
+{
+ // FIXME: Implement mock binding
+}
+
+void WebGeolocationServiceMock::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
+{
+ // FIXME: Implement mock binding
+}
+
+void WebGeolocationServiceMock::setMockGeolocationError(int errorCode, const WebString& message)
+{
+ // FIXME: Implement mock binding
+}
+
+} // namespace WebKit
+
+#else
+using WebCore::Coordinates;
+using WebCore::Frame;
+using WebCore::Geolocation;
+using WebCore::GeolocationServiceBridge;
+using WebCore::GeolocationServiceChromium;
+using WebCore::GeolocationServiceClient;
+using WebCore::GeolocationServiceMock;
+using WebCore::Geoposition;
+using WebCore::PositionError;
+using WebCore::PositionOptions;
+using WTF::String;
+using WTF::Vector;
+
+namespace WebCore {
+class GeolocationServiceChromiumMock : public GeolocationServiceChromium, public GeolocationServiceClient {
+public:
+ static GeolocationService* create(GeolocationServiceClient*);
+ virtual bool startUpdating(PositionOptions*);
+ virtual void stopUpdating();
+ virtual Geoposition* lastPosition() const;
+ virtual PositionError* lastError() const;
+
+ virtual void geolocationServicePositionChanged(GeolocationService*);
+ virtual void geolocationServiceErrorOccurred(GeolocationService*);
+
+private:
+ explicit GeolocationServiceChromiumMock(GeolocationServiceClient*);
+
+ GeolocationServiceClient* m_geolocationServiceClient;
+ OwnPtr<GeolocationService> m_geolocationServiceMock;
+};
+
+GeolocationService* GeolocationServiceChromiumMock::create(GeolocationServiceClient* geolocationServiceClient)
+{
+ return new GeolocationServiceChromiumMock(geolocationServiceClient);
+}
+
+GeolocationServiceChromiumMock::GeolocationServiceChromiumMock(GeolocationServiceClient* geolocationServiceClient)
+ : GeolocationServiceChromium(geolocationServiceClient),
+ m_geolocationServiceClient(geolocationServiceClient)
+{
+ m_geolocationServiceMock.set(GeolocationServiceMock::create(this));
+}
+
+bool GeolocationServiceChromiumMock::startUpdating(PositionOptions* positionOptions)
+{
+ GeolocationServiceChromium::startUpdating(positionOptions);
+ return m_geolocationServiceMock->startUpdating(positionOptions);
+}
+
+void GeolocationServiceChromiumMock::stopUpdating()
+{
+ GeolocationServiceChromium::stopUpdating();
+ m_geolocationServiceMock->stopUpdating();
+}
+
+Geoposition* GeolocationServiceChromiumMock::lastPosition() const
+{
+ return m_geolocationServiceMock->lastPosition();
+}
+
+PositionError* GeolocationServiceChromiumMock::lastError() const
+{
+ return m_geolocationServiceMock->lastError();
+}
+
+void GeolocationServiceChromiumMock::geolocationServicePositionChanged(GeolocationService* geolocationService)
+{
+ ASSERT_UNUSED(geolocationService, geolocationService == m_geolocationServiceMock);
+ m_geolocationServiceClient->geolocationServicePositionChanged(this);
+
+}
+
+void GeolocationServiceChromiumMock::geolocationServiceErrorOccurred(GeolocationService* geolocationService)
+{
+ ASSERT_UNUSED(geolocationService, geolocationService == m_geolocationServiceMock);
+ m_geolocationServiceClient->geolocationServiceErrorOccurred(this);
+}
+
+} // namespace WebCore
+
+namespace WebKit {
+
+class WebGeolocationServiceMockImpl : public WebGeolocationServiceMock {
+public:
+ WebGeolocationServiceMockImpl();
+ virtual ~WebGeolocationServiceMockImpl();
+ static void setMockGeolocationPermission(bool allowed);
+
+ // WebGeolocationService
+ virtual void requestPermissionForFrame(int bridgeId, const WebURL& url);
+ virtual int attachBridge(WebGeolocationServiceBridge*);
+ virtual void detachBridge(int bridgeId);
+
+private:
+ void notifyPendingPermissions();
+
+ typedef HashMap<int, WebGeolocationServiceBridge*> IdToBridgeMap;
+ IdToBridgeMap m_idToBridgeMap;
+ Vector<int> m_pendingPermissionRequests;
+
+ // In addition to the singleton instance pointer, we need to keep the setMockGeolocationPermission() state
+ // as a static (not object members) as this call may come in before the service has been created.
+ static enum PermissionState {
+ PermissionStateUnset,
+ PermissionStateAllowed,
+ PermissionStateDenied,
+ } s_permissionState;
+ static WebGeolocationServiceMockImpl* s_instance;
+};
+
+WebGeolocationServiceMockImpl::PermissionState WebGeolocationServiceMockImpl::s_permissionState = WebGeolocationServiceMockImpl::PermissionStateUnset;
+WebGeolocationServiceMockImpl* WebGeolocationServiceMockImpl::s_instance = 0;
+
+WebGeolocationServiceMock* WebGeolocationServiceMock::createWebGeolocationServiceMock()
+{
+ return new WebGeolocationServiceMockImpl;
+}
+
+void WebGeolocationServiceMock::setMockGeolocationPermission(bool allowed)
+{
+ WebGeolocationServiceMockImpl::setMockGeolocationPermission(allowed);
+}
+
+void WebGeolocationServiceMock::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
+{
+ WebCore::GeolocationService::setCustomMockFactory(&WebCore::GeolocationServiceChromiumMock::create);
+ RefPtr<Geoposition> geoposition = Geoposition::create(Coordinates::create(latitude, longitude, false, 0, accuracy, true, 0, false, 0, false, 0), currentTime() * 1000.0);
+ GeolocationServiceMock::setPosition(geoposition);
+}
+
+void WebGeolocationServiceMock::setMockGeolocationError(int errorCode, const WebString& message)
+{
+ WebCore::GeolocationService::setCustomMockFactory(&WebCore::GeolocationServiceChromiumMock::create);
+ RefPtr<PositionError> positionError = PositionError::create(static_cast<PositionError::ErrorCode>(errorCode), message);
+ GeolocationServiceMock::setError(positionError);
+}
+
+WebGeolocationServiceMockImpl::WebGeolocationServiceMockImpl()
+{
+ ASSERT(!s_instance);
+ s_instance = this;
+}
+
+WebGeolocationServiceMockImpl::~WebGeolocationServiceMockImpl()
+{
+ ASSERT(this == s_instance);
+ s_instance = 0;
+ // Reset the permission state, so any future service instance (e.g. running
+ // multiple tests in a single DRT run) will see a clean call sequence.
+ s_permissionState = PermissionStateUnset;
+ for (IdToBridgeMap::iterator it = m_idToBridgeMap.begin(); it != m_idToBridgeMap.end(); ++it)
+ it->second->didDestroyGeolocationService();
+}
+
+void WebGeolocationServiceMockImpl::setMockGeolocationPermission(bool allowed)
+{
+ s_permissionState = allowed ? PermissionStateAllowed : PermissionStateDenied;
+ if (s_instance)
+ s_instance->notifyPendingPermissions();
+}
+
+void WebGeolocationServiceMockImpl::requestPermissionForFrame(int bridgeId, const WebURL& url)
+{
+ m_pendingPermissionRequests.append(bridgeId);
+ if (s_permissionState != PermissionStateUnset)
+ notifyPendingPermissions();
+}
+
+int WebGeolocationServiceMockImpl::attachBridge(WebGeolocationServiceBridge* bridge)
+{
+ static int nextAvailableWatchId = 1;
+ // In case of overflow, make sure the ID remains positive, but reuse the ID values.
+ if (nextAvailableWatchId < 1)
+ nextAvailableWatchId = 1;
+ m_idToBridgeMap.set(nextAvailableWatchId, bridge);
+ return nextAvailableWatchId++;
+}
+
+void WebGeolocationServiceMockImpl::detachBridge(int bridgeId)
+{
+ m_idToBridgeMap.remove(bridgeId);
+}
+
+void WebGeolocationServiceMockImpl::notifyPendingPermissions()
+{
+ ASSERT(s_permissionState == PermissionStateAllowed || s_permissionState == PermissionStateDenied);
+ Vector<int> pendingPermissionRequests;
+ pendingPermissionRequests.swap(m_pendingPermissionRequests);
+ for (Vector<int>::const_iterator it = pendingPermissionRequests.begin(); it != pendingPermissionRequests.end(); ++it) {
+ ASSERT(*it > 0);
+ IdToBridgeMap::iterator iter = m_idToBridgeMap.find(*it);
+ if (iter != m_idToBridgeMap.end())
+ iter->second->setIsAllowed(s_permissionState == PermissionStateAllowed);
+ }
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(CLIENT_BASED_GEOLOCATION)
+#endif // ENABLE(GEOLOCATION)
diff --git a/WebKit/chromium/src/APUAgentDelegate.h b/WebKit/chromium/src/WebGraphicsContext3D.cpp
index 70be702..ce6f55d 100644
--- a/WebKit/chromium/src/APUAgentDelegate.h
+++ b/WebKit/chromium/src/WebGraphicsContext3D.cpp
@@ -28,19 +28,20 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef APUAgentDelegate_h
-#define APUAgentDelegate_h
+#include "config.h"
+#include "WebGraphicsContext3D.h"
-#include "DevToolsRPC.h"
+#include "WebGraphicsContext3DDefaultImpl.h"
namespace WebKit {
-#define APU_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3, MEHTOD4, METHOD5) \
- /* Sends a json object to apu. */ \
- METHOD1(dispatchToApu, String /* data */)
-
-DEFINE_RPC_CLASS(ApuAgentDelegate, APU_AGENT_DELEGATE_STRUCT)
+WebGraphicsContext3D* WebGraphicsContext3D::createDefault()
+{
+#if ENABLE(3D_CANVAS)
+ return new WebGraphicsContext3DDefaultImpl();
+#else
+ return 0;
+#endif
+}
} // namespace WebKit
-
-#endif
diff --git a/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp b/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp
new file mode 100644
index 0000000..9a74601
--- /dev/null
+++ b/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp
@@ -0,0 +1,1634 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+
+#if ENABLE(3D_CANVAS)
+
+#include "WebGraphicsContext3DDefaultImpl.h"
+
+#include "app/gfx/gl/gl_bindings.h"
+#include "app/gfx/gl/gl_context.h"
+#include "app/gfx/gl/gl_implementation.h"
+#include "NotImplemented.h"
+#include "WebView.h"
+#include <wtf/OwnArrayPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/text/StringBuilder.h>
+#include <wtf/text/WTFString.h>
+
+#include <stdio.h>
+#include <string.h>
+
+namespace WebKit {
+
+enum {
+ MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB,
+ MAX_VARYING_VECTORS = 0x8DFC,
+ MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD
+};
+
+WebGraphicsContext3DDefaultImpl::VertexAttribPointerState::VertexAttribPointerState()
+ : enabled(false)
+ , buffer(0)
+ , indx(0)
+ , size(0)
+ , type(0)
+ , normalized(false)
+ , stride(0)
+ , offset(0)
+{
+}
+
+WebGraphicsContext3DDefaultImpl::WebGraphicsContext3DDefaultImpl()
+ : m_initialized(false)
+ , m_renderDirectlyToWebView(false)
+ , m_isGLES2(false)
+ , m_haveEXTFramebufferObject(false)
+ , m_haveEXTFramebufferMultisample(false)
+ , m_haveANGLEFramebufferMultisample(false)
+ , m_texture(0)
+ , m_fbo(0)
+ , m_depthStencilBuffer(0)
+ , m_cachedWidth(0)
+ , m_cachedHeight(0)
+ , m_multisampleFBO(0)
+ , m_multisampleDepthStencilBuffer(0)
+ , m_multisampleColorBuffer(0)
+ , m_boundFBO(0)
+ , m_boundTexture(0)
+ , m_copyTextureToParentTextureFBO(0)
+#ifdef FLIP_FRAMEBUFFER_VERTICALLY
+ , m_scanline(0)
+#endif
+ , m_boundArrayBuffer(0)
+ , m_fragmentCompiler(0)
+ , m_vertexCompiler(0)
+{
+}
+
+WebGraphicsContext3DDefaultImpl::~WebGraphicsContext3DDefaultImpl()
+{
+ if (m_initialized) {
+ makeContextCurrent();
+
+ if (m_attributes.antialias) {
+ glDeleteRenderbuffersEXT(1, &m_multisampleColorBuffer);
+ if (m_attributes.depth || m_attributes.stencil)
+ glDeleteRenderbuffersEXT(1, &m_multisampleDepthStencilBuffer);
+ glDeleteFramebuffersEXT(1, &m_multisampleFBO);
+ } else {
+ if (m_attributes.depth || m_attributes.stencil)
+ glDeleteRenderbuffersEXT(1, &m_depthStencilBuffer);
+ }
+ glDeleteTextures(1, &m_texture);
+ glDeleteFramebuffersEXT(1, &m_copyTextureToParentTextureFBO);
+#ifdef FLIP_FRAMEBUFFER_VERTICALLY
+ if (m_scanline)
+ delete[] m_scanline;
+#endif
+ glDeleteFramebuffersEXT(1, &m_fbo);
+
+ m_glContext->Destroy();
+
+ for (ShaderSourceMap::iterator ii = m_shaderSourceMap.begin(); ii != m_shaderSourceMap.end(); ++ii) {
+ if (ii->second)
+ delete ii->second;
+ }
+ angleDestroyCompilers();
+ }
+}
+
+bool WebGraphicsContext3DDefaultImpl::initialize(WebGraphicsContext3D::Attributes attributes, WebView* webView, bool renderDirectlyToWebView)
+{
+ if (!gfx::GLContext::InitializeOneOff())
+ return false;
+
+ m_renderDirectlyToWebView = renderDirectlyToWebView;
+ gfx::GLContext* shareContext = 0;
+
+ if (!renderDirectlyToWebView) {
+ // Pick up the compositor's context to share resources with.
+ WebGraphicsContext3D* viewContext = webView->graphicsContext3D();
+ if (viewContext) {
+ WebGraphicsContext3DDefaultImpl* contextImpl = static_cast<WebGraphicsContext3DDefaultImpl*>(viewContext);
+ shareContext = contextImpl->m_glContext.get();
+ } else {
+ // The compositor's context didn't get created
+ // successfully, so conceptually there is no way we can
+ // render successfully to the WebView.
+ m_renderDirectlyToWebView = false;
+ }
+ }
+
+ // This implementation always renders offscreen regardless of
+ // whether renderDirectlyToWebView is true. Both DumpRenderTree
+ // and test_shell paint first to an intermediate offscreen buffer
+ // and from there to the window, and WebViewImpl::paint already
+ // correctly handles the case where the compositor is active but
+ // the output needs to go to a WebCanvas.
+ m_glContext = WTF::adoptPtr(gfx::GLContext::CreateOffscreenGLContext(shareContext));
+ if (!m_glContext)
+ return false;
+
+ m_attributes = attributes;
+
+ // FIXME: for the moment we disable multisampling for the compositor.
+ // It actually works in this implementation, but there are a few
+ // considerations. First, we likely want to reduce the fuzziness in
+ // these tests as much as possible because we want to run pixel tests.
+ // Second, Mesa's multisampling doesn't seem to antialias straight
+ // edges in some CSS 3D samples. Third, we don't have multisampling
+ // support for the compositor in the normal case at the time of this
+ // writing.
+ if (renderDirectlyToWebView)
+ m_attributes.antialias = false;
+
+ m_isGLES2 = gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2;
+ const char* extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
+ m_haveEXTFramebufferObject = strstr(extensions, "GL_EXT_framebuffer_object");
+ m_haveEXTFramebufferMultisample = strstr(extensions, "GL_EXT_framebuffer_multisample");
+ m_haveANGLEFramebufferMultisample = strstr(extensions, "GL_ANGLE_framebuffer_multisample");
+
+ validateAttributes();
+
+ if (!m_isGLES2) {
+ glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
+ glEnable(GL_POINT_SPRITE);
+ }
+
+ if (!angleCreateCompilers()) {
+ angleDestroyCompilers();
+ return false;
+ }
+
+ glGenFramebuffersEXT(1, &m_copyTextureToParentTextureFBO);
+
+ m_initialized = true;
+ return true;
+}
+
+void WebGraphicsContext3DDefaultImpl::validateAttributes()
+{
+ const char* extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
+
+ if (m_attributes.stencil) {
+ if (strstr(extensions, "GL_OES_packed_depth_stencil")
+ || strstr(extensions, "GL_EXT_packed_depth_stencil")) {
+ if (!m_attributes.depth)
+ m_attributes.depth = true;
+ } else
+ m_attributes.stencil = false;
+ }
+ if (m_attributes.antialias) {
+ bool isValidVendor = true;
+#if PLATFORM(CG)
+ // Currently in Mac we only turn on antialias if vendor is NVIDIA.
+ const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
+ if (!strstr(vendor, "NVIDIA"))
+ isValidVendor = false;
+#endif
+ if (!(isValidVendor
+ && (m_haveEXTFramebufferMultisample
+ || (m_haveANGLEFramebufferMultisample && strstr(extensions, "GL_OES_rgb8_rgba8")))))
+ m_attributes.antialias = false;
+
+ // Don't antialias when using Mesa to ensure more reliable testing and
+ // because it doesn't appear to multisample straight lines correctly.
+ const char* renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
+ if (!strncmp(renderer, "Mesa", 4))
+ m_attributes.antialias = false;
+ }
+ // FIXME: instead of enforcing premultipliedAlpha = true, implement the
+ // correct behavior when premultipliedAlpha = false is requested.
+ m_attributes.premultipliedAlpha = true;
+}
+
+void WebGraphicsContext3DDefaultImpl::resolveMultisampledFramebuffer(unsigned x, unsigned y, unsigned width, unsigned height)
+{
+ if (m_attributes.antialias) {
+ glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO);
+ glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo);
+ if (m_haveEXTFramebufferMultisample)
+ glBlitFramebufferEXT(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+ else {
+ ASSERT(m_haveANGLEFramebufferMultisample);
+ glBlitFramebufferANGLE(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+ }
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
+ }
+}
+
+bool WebGraphicsContext3DDefaultImpl::makeContextCurrent()
+{
+ return m_glContext->MakeCurrent();
+}
+
+int WebGraphicsContext3DDefaultImpl::width()
+{
+ return m_cachedWidth;
+}
+
+int WebGraphicsContext3DDefaultImpl::height()
+{
+ return m_cachedHeight;
+}
+
+int WebGraphicsContext3DDefaultImpl::sizeInBytes(int type)
+{
+ switch (type) {
+ case GL_BYTE:
+ return sizeof(GLbyte);
+ case GL_UNSIGNED_BYTE:
+ return sizeof(GLubyte);
+ case GL_SHORT:
+ return sizeof(GLshort);
+ case GL_UNSIGNED_SHORT:
+ return sizeof(GLushort);
+ case GL_INT:
+ return sizeof(GLint);
+ case GL_UNSIGNED_INT:
+ return sizeof(GLuint);
+ case GL_FLOAT:
+ return sizeof(GLfloat);
+ }
+ return 0;
+}
+
+bool WebGraphicsContext3DDefaultImpl::isGLES2Compliant()
+{
+ return m_isGLES2;
+}
+
+unsigned int WebGraphicsContext3DDefaultImpl::getPlatformTextureId()
+{
+ return m_texture;
+}
+
+void WebGraphicsContext3DDefaultImpl::prepareTexture()
+{
+ if (!m_renderDirectlyToWebView) {
+ // We need to prepare our rendering results for the compositor.
+ makeContextCurrent();
+ resolveMultisampledFramebuffer(0, 0, m_cachedWidth, m_cachedHeight);
+ }
+}
+
+static int createTextureObject(GLenum target)
+{
+ GLuint texture = 0;
+ glGenTextures(1, &texture);
+ glBindTexture(target, texture);
+ glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ return texture;
+}
+
+void WebGraphicsContext3DDefaultImpl::reshape(int width, int height)
+{
+ m_cachedWidth = width;
+ m_cachedHeight = height;
+ makeContextCurrent();
+
+ GLenum target = GL_TEXTURE_2D;
+
+ if (!m_texture) {
+ // Generate the texture object
+ m_texture = createTextureObject(target);
+ // Generate the framebuffer object
+ glGenFramebuffersEXT(1, &m_fbo);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+ m_boundFBO = m_fbo;
+ if (m_attributes.depth || m_attributes.stencil)
+ glGenRenderbuffersEXT(1, &m_depthStencilBuffer);
+ // Generate the multisample framebuffer object
+ if (m_attributes.antialias) {
+ glGenFramebuffersEXT(1, &m_multisampleFBO);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
+ m_boundFBO = m_multisampleFBO;
+ glGenRenderbuffersEXT(1, &m_multisampleColorBuffer);
+ if (m_attributes.depth || m_attributes.stencil)
+ glGenRenderbuffersEXT(1, &m_multisampleDepthStencilBuffer);
+ }
+ }
+
+ GLint internalMultisampledColorFormat, internalColorFormat, colorFormat, internalDepthStencilFormat = 0;
+ if (m_attributes.alpha) {
+ // GL_RGBA8_OES == GL_RGBA8
+ internalMultisampledColorFormat = GL_RGBA8;
+ internalColorFormat = m_isGLES2 ? GL_RGBA : GL_RGBA8;
+ colorFormat = GL_RGBA;
+ } else {
+ // GL_RGB8_OES == GL_RGB8
+ internalMultisampledColorFormat = GL_RGB8;
+ internalColorFormat = m_isGLES2 ? GL_RGB : GL_RGB8;
+ colorFormat = GL_RGB;
+ }
+ if (m_attributes.stencil || m_attributes.depth) {
+ // We don't allow the logic where stencil is required and depth is not.
+ // See GraphicsContext3DInternal constructor.
+ if (m_attributes.stencil && m_attributes.depth)
+ internalDepthStencilFormat = GL_DEPTH24_STENCIL8_EXT;
+ else {
+ if (m_isGLES2)
+ internalDepthStencilFormat = GL_DEPTH_COMPONENT16;
+ else
+ internalDepthStencilFormat = GL_DEPTH_COMPONENT;
+ }
+ }
+
+ bool mustRestoreFBO = false;
+
+ // Resize multisampling FBO
+ if (m_attributes.antialias) {
+ GLint maxSampleCount;
+ glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSampleCount);
+ GLint sampleCount = std::min(8, maxSampleCount);
+ if (m_boundFBO != m_multisampleFBO) {
+ mustRestoreFBO = true;
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
+ }
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_multisampleColorBuffer);
+ if (m_haveEXTFramebufferMultisample)
+ glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleCount, internalMultisampledColorFormat, width, height);
+ else {
+ ASSERT(m_haveANGLEFramebufferMultisample);
+ glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER_EXT, sampleCount, internalMultisampledColorFormat, width, height);
+ }
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_multisampleColorBuffer);
+ if (m_attributes.stencil || m_attributes.depth) {
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer);
+ if (m_haveEXTFramebufferMultisample)
+ glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleCount, internalDepthStencilFormat, width, height);
+ else {
+ ASSERT(m_haveANGLEFramebufferMultisample);
+ glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER_EXT, sampleCount, internalDepthStencilFormat, width, height);
+ }
+ if (m_attributes.stencil)
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer);
+ if (m_attributes.depth)
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer);
+ }
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+ GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+ printf("GraphicsContext3D: multisampling framebuffer was incomplete\n");
+
+ // FIXME: cleanup.
+ notImplemented();
+ }
+ }
+
+ // Resize regular FBO
+ if (m_boundFBO != m_fbo) {
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+ mustRestoreFBO = true;
+ }
+ glBindTexture(target, m_texture);
+ glTexImage2D(target, 0, internalColorFormat, width, height, 0, colorFormat, GL_UNSIGNED_BYTE, 0);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target, m_texture, 0);
+ glBindTexture(target, 0);
+ if (!m_attributes.antialias && (m_attributes.stencil || m_attributes.depth)) {
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthStencilBuffer);
+ glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, internalDepthStencilFormat, width, height);
+ if (m_attributes.stencil)
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthStencilBuffer);
+ if (m_attributes.depth)
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthStencilBuffer);
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+ }
+ GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+ printf("WebGraphicsContext3DDefaultImpl: framebuffer was incomplete\n");
+
+ // FIXME: cleanup.
+ notImplemented();
+ }
+
+ if (m_attributes.antialias) {
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
+ if (m_boundFBO == m_multisampleFBO)
+ mustRestoreFBO = false;
+ }
+
+ // Initialize renderbuffers to 0.
+ GLfloat clearColor[] = {0, 0, 0, 0}, clearDepth = 0;
+ GLint clearStencil = 0;
+ GLboolean colorMask[] = {GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE}, depthMask = GL_TRUE;
+ GLuint stencilMask = 0xffffffff;
+ GLboolean isScissorEnabled = GL_FALSE;
+ GLboolean isDitherEnabled = GL_FALSE;
+ GLbitfield clearMask = GL_COLOR_BUFFER_BIT;
+ glGetFloatv(GL_COLOR_CLEAR_VALUE, clearColor);
+ glClearColor(0, 0, 0, 0);
+ glGetBooleanv(GL_COLOR_WRITEMASK, colorMask);
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ if (m_attributes.depth) {
+ glGetFloatv(GL_DEPTH_CLEAR_VALUE, &clearDepth);
+ glClearDepth(1);
+ glGetBooleanv(GL_DEPTH_WRITEMASK, &depthMask);
+ glDepthMask(GL_TRUE);
+ clearMask |= GL_DEPTH_BUFFER_BIT;
+ }
+ if (m_attributes.stencil) {
+ glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &clearStencil);
+ glClearStencil(0);
+ glGetIntegerv(GL_STENCIL_WRITEMASK, reinterpret_cast<GLint*>(&stencilMask));
+ glStencilMaskSeparate(GL_FRONT, 0xffffffff);
+ clearMask |= GL_STENCIL_BUFFER_BIT;
+ }
+ isScissorEnabled = glIsEnabled(GL_SCISSOR_TEST);
+ glDisable(GL_SCISSOR_TEST);
+ isDitherEnabled = glIsEnabled(GL_DITHER);
+ glDisable(GL_DITHER);
+
+ glClear(clearMask);
+
+ glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
+ glColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]);
+ if (m_attributes.depth) {
+ glClearDepth(clearDepth);
+ glDepthMask(depthMask);
+ }
+ if (m_attributes.stencil) {
+ glClearStencil(clearStencil);
+ glStencilMaskSeparate(GL_FRONT, stencilMask);
+ }
+ if (isScissorEnabled)
+ glEnable(GL_SCISSOR_TEST);
+ else
+ glDisable(GL_SCISSOR_TEST);
+ if (isDitherEnabled)
+ glEnable(GL_DITHER);
+ else
+ glDisable(GL_DITHER);
+
+ if (mustRestoreFBO)
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
+
+#ifdef FLIP_FRAMEBUFFER_VERTICALLY
+ if (m_scanline) {
+ delete[] m_scanline;
+ m_scanline = 0;
+ }
+ m_scanline = new unsigned char[width * 4];
+#endif // FLIP_FRAMEBUFFER_VERTICALLY
+}
+
+#ifdef FLIP_FRAMEBUFFER_VERTICALLY
+void WebGraphicsContext3DDefaultImpl::flipVertically(unsigned char* framebuffer,
+ unsigned int width,
+ unsigned int height)
+{
+ unsigned char* scanline = m_scanline;
+ if (!scanline)
+ return;
+ unsigned int rowBytes = width * 4;
+ unsigned int count = height / 2;
+ for (unsigned int i = 0; i < count; i++) {
+ unsigned char* rowA = framebuffer + i * rowBytes;
+ unsigned char* rowB = framebuffer + (height - i - 1) * rowBytes;
+ // FIXME: this is where the multiplication of the alpha
+ // channel into the color buffer will need to occur if the
+ // user specifies the "premultiplyAlpha" flag in the context
+ // creation attributes.
+ memcpy(scanline, rowB, rowBytes);
+ memcpy(rowB, rowA, rowBytes);
+ memcpy(rowA, scanline, rowBytes);
+ }
+}
+#endif
+
+bool WebGraphicsContext3DDefaultImpl::readBackFramebuffer(unsigned char* pixels, size_t bufferSize)
+{
+ if (bufferSize != static_cast<size_t>(4 * width() * height()))
+ return false;
+
+ makeContextCurrent();
+
+ // Earlier versions of this code used the GPU to flip the
+ // framebuffer vertically before reading it back for compositing
+ // via software. This code was quite complicated, used a lot of
+ // GPU memory, and didn't provide an obvious speedup. Since this
+ // vertical flip is only a temporary solution anyway until Chrome
+ // is fully GPU composited, it wasn't worth the complexity.
+
+ resolveMultisampledFramebuffer(0, 0, m_cachedWidth, m_cachedHeight);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+
+ GLint packAlignment = 4;
+ bool mustRestorePackAlignment = false;
+ glGetIntegerv(GL_PACK_ALIGNMENT, &packAlignment);
+ if (packAlignment > 4) {
+ glPixelStorei(GL_PACK_ALIGNMENT, 4);
+ mustRestorePackAlignment = true;
+ }
+
+ if (m_isGLES2) {
+ // FIXME: consider testing for presence of GL_OES_read_format
+ // and GL_EXT_read_format_bgra, and using GL_BGRA_EXT here
+ // directly.
+ glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ for (size_t i = 0; i < bufferSize; i += 4)
+ std::swap(pixels[i], pixels[i + 2]);
+ } else
+ glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
+
+ if (mustRestorePackAlignment)
+ glPixelStorei(GL_PACK_ALIGNMENT, packAlignment);
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
+
+#ifdef FLIP_FRAMEBUFFER_VERTICALLY
+ if (pixels)
+ flipVertically(pixels, m_cachedWidth, m_cachedHeight);
+#endif
+
+ return true;
+}
+
+void WebGraphicsContext3DDefaultImpl::synthesizeGLError(unsigned long error)
+{
+ m_syntheticErrors.add(error);
+}
+
+void* WebGraphicsContext3DDefaultImpl::mapBufferSubDataCHROMIUM(unsigned target, int offset, int size, unsigned access)
+{
+ return 0;
+}
+
+void WebGraphicsContext3DDefaultImpl::unmapBufferSubDataCHROMIUM(const void* mem)
+{
+}
+
+void* WebGraphicsContext3DDefaultImpl::mapTexSubImage2DCHROMIUM(unsigned target, int level, int xoffset, int yoffset, int width, int height, unsigned format, unsigned type, unsigned access)
+{
+ return 0;
+}
+
+void WebGraphicsContext3DDefaultImpl::unmapTexSubImage2DCHROMIUM(const void* mem)
+{
+}
+
+void WebGraphicsContext3DDefaultImpl::copyTextureToParentTextureCHROMIUM(unsigned id, unsigned id2)
+{
+ if (!glGetTexLevelParameteriv)
+ return;
+
+ makeContextCurrent();
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_copyTextureToParentTextureFBO);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
+ GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D,
+ id,
+ 0); // level
+ glBindTexture(GL_TEXTURE_2D, id2);
+ GLsizei width, height;
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
+ glCopyTexImage2D(GL_TEXTURE_2D,
+ 0, // level
+ GL_RGBA,
+ 0, 0, // x, y
+ width,
+ height,
+ 0); // border
+ glBindTexture(GL_TEXTURE_2D, m_boundTexture);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
+}
+
+// Helper macros to reduce the amount of code.
+
+#define DELEGATE_TO_GL(name, glname) \
+void WebGraphicsContext3DDefaultImpl::name() \
+{ \
+ makeContextCurrent(); \
+ gl##glname(); \
+}
+
+#define DELEGATE_TO_GL_1(name, glname, t1) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1); \
+}
+
+#define DELEGATE_TO_GL_1R(name, glname, t1, rt) \
+rt WebGraphicsContext3DDefaultImpl::name(t1 a1) \
+{ \
+ makeContextCurrent(); \
+ return gl##glname(a1); \
+}
+
+#define DELEGATE_TO_GL_2(name, glname, t1, t2) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1, a2); \
+}
+
+#define DELEGATE_TO_GL_2R(name, glname, t1, t2, rt) \
+rt WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2) \
+{ \
+ makeContextCurrent(); \
+ return gl##glname(a1, a2); \
+}
+
+#define DELEGATE_TO_GL_3(name, glname, t1, t2, t3) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1, a2, a3); \
+}
+
+#define DELEGATE_TO_GL_4(name, glname, t1, t2, t3, t4) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1, a2, a3, a4); \
+}
+
+#define DELEGATE_TO_GL_5(name, glname, t1, t2, t3, t4, t5) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1, a2, a3, a4, a5); \
+}
+
+#define DELEGATE_TO_GL_6(name, glname, t1, t2, t3, t4, t5, t6) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1, a2, a3, a4, a5, a6); \
+}
+
+#define DELEGATE_TO_GL_7(name, glname, t1, t2, t3, t4, t5, t6, t7) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1, a2, a3, a4, a5, a6, a7); \
+}
+
+#define DELEGATE_TO_GL_8(name, glname, t1, t2, t3, t4, t5, t6, t7, t8) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1, a2, a3, a4, a5, a6, a7, a8); \
+}
+
+#define DELEGATE_TO_GL_9(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, t9) \
+void WebGraphicsContext3DDefaultImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8, t9 a9) \
+{ \
+ makeContextCurrent(); \
+ gl##glname(a1, a2, a3, a4, a5, a6, a7, a8, a9); \
+}
+
+void WebGraphicsContext3DDefaultImpl::activeTexture(unsigned long texture)
+{
+ // FIXME: query number of textures available.
+ if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0+32)
+ // FIXME: raise exception.
+ return;
+
+ makeContextCurrent();
+ glActiveTexture(texture);
+}
+
+DELEGATE_TO_GL_2(attachShader, AttachShader, WebGLId, WebGLId)
+
+DELEGATE_TO_GL_3(bindAttribLocation, BindAttribLocation, WebGLId, unsigned long, const char*)
+
+void WebGraphicsContext3DDefaultImpl::bindBuffer(unsigned long target, WebGLId buffer)
+{
+ makeContextCurrent();
+ if (target == GL_ARRAY_BUFFER)
+ m_boundArrayBuffer = buffer;
+ glBindBuffer(target, buffer);
+}
+
+void WebGraphicsContext3DDefaultImpl::bindFramebuffer(unsigned long target, WebGLId framebuffer)
+{
+ makeContextCurrent();
+ if (!framebuffer)
+ framebuffer = (m_attributes.antialias ? m_multisampleFBO : m_fbo);
+ if (framebuffer != m_boundFBO) {
+ glBindFramebufferEXT(target, framebuffer);
+ m_boundFBO = framebuffer;
+ }
+}
+
+DELEGATE_TO_GL_2(bindRenderbuffer, BindRenderbufferEXT, unsigned long, WebGLId)
+
+void WebGraphicsContext3DDefaultImpl::bindTexture(unsigned long target, WebGLId texture)
+{
+ makeContextCurrent();
+ glBindTexture(target, texture);
+ m_boundTexture = texture;
+}
+
+DELEGATE_TO_GL_4(blendColor, BlendColor, double, double, double, double)
+
+DELEGATE_TO_GL_1(blendEquation, BlendEquation, unsigned long)
+
+DELEGATE_TO_GL_2(blendEquationSeparate, BlendEquationSeparate, unsigned long, unsigned long)
+
+DELEGATE_TO_GL_2(blendFunc, BlendFunc, unsigned long, unsigned long)
+
+DELEGATE_TO_GL_4(blendFuncSeparate, BlendFuncSeparate, unsigned long, unsigned long, unsigned long, unsigned long)
+
+DELEGATE_TO_GL_4(bufferData, BufferData, unsigned long, int, const void*, unsigned long)
+
+DELEGATE_TO_GL_4(bufferSubData, BufferSubData, unsigned long, long, int, const void*)
+
+DELEGATE_TO_GL_1R(checkFramebufferStatus, CheckFramebufferStatusEXT, unsigned long, unsigned long)
+
+DELEGATE_TO_GL_1(clear, Clear, unsigned long)
+
+DELEGATE_TO_GL_4(clearColor, ClearColor, double, double, double, double)
+
+DELEGATE_TO_GL_1(clearDepth, ClearDepth, double)
+
+DELEGATE_TO_GL_1(clearStencil, ClearStencil, long)
+
+DELEGATE_TO_GL_4(colorMask, ColorMask, bool, bool, bool, bool)
+
+void WebGraphicsContext3DDefaultImpl::compileShader(WebGLId shader)
+{
+ makeContextCurrent();
+
+ ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader);
+ if (result == m_shaderSourceMap.end()) {
+ // Passing down to gl driver to generate the correct error; or the case
+ // where the shader deletion is delayed when it's attached to a program.
+ glCompileShader(shader);
+ return;
+ }
+ ShaderSourceEntry* entry = result->second;
+ ASSERT(entry);
+
+ if (!angleValidateShaderSource(*entry))
+ return; // Shader didn't validate, don't move forward with compiling translated source
+
+ int shaderLength = entry->translatedSource ? strlen(entry->translatedSource) : 0;
+ glShaderSource(shader, 1, const_cast<const char**>(&entry->translatedSource), &shaderLength);
+ glCompileShader(shader);
+
+#ifndef NDEBUG
+ int compileStatus;
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
+ // ASSERT that ANGLE generated GLSL will be accepted by OpenGL
+ ASSERT(compileStatus == GL_TRUE);
+#endif
+}
+
+void WebGraphicsContext3DDefaultImpl::copyTexImage2D(unsigned long target, long level, unsigned long internalformat,
+ long x, long y, unsigned long width, unsigned long height, long border)
+{
+ makeContextCurrent();
+
+ bool needsResolve = (m_attributes.antialias && m_boundFBO == m_multisampleFBO);
+ if (needsResolve) {
+ resolveMultisampledFramebuffer(x, y, width, height);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+ }
+
+ glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+
+ if (needsResolve)
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
+}
+
+void WebGraphicsContext3DDefaultImpl::copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset,
+ long x, long y, unsigned long width, unsigned long height)
+{
+ makeContextCurrent();
+
+ bool needsResolve = (m_attributes.antialias && m_boundFBO == m_multisampleFBO);
+ if (needsResolve) {
+ resolveMultisampledFramebuffer(x, y, width, height);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+ }
+
+ glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+
+ if (needsResolve)
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
+}
+
+DELEGATE_TO_GL_1(cullFace, CullFace, unsigned long)
+
+DELEGATE_TO_GL_1(depthFunc, DepthFunc, unsigned long)
+
+DELEGATE_TO_GL_1(depthMask, DepthMask, bool)
+
+DELEGATE_TO_GL_2(depthRange, DepthRange, double, double)
+
+DELEGATE_TO_GL_2(detachShader, DetachShader, WebGLId, WebGLId)
+
+DELEGATE_TO_GL_1(disable, Disable, unsigned long)
+
+void WebGraphicsContext3DDefaultImpl::disableVertexAttribArray(unsigned long index)
+{
+ makeContextCurrent();
+ if (index < NumTrackedPointerStates)
+ m_vertexAttribPointerState[index].enabled = false;
+ glDisableVertexAttribArray(index);
+}
+
+DELEGATE_TO_GL_3(drawArrays, DrawArrays, unsigned long, long, long)
+
+void WebGraphicsContext3DDefaultImpl::drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset)
+{
+ makeContextCurrent();
+ glDrawElements(mode, count, type,
+ reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
+}
+
+DELEGATE_TO_GL_1(enable, Enable, unsigned long)
+
+void WebGraphicsContext3DDefaultImpl::enableVertexAttribArray(unsigned long index)
+{
+ makeContextCurrent();
+ if (index < NumTrackedPointerStates)
+ m_vertexAttribPointerState[index].enabled = true;
+ glEnableVertexAttribArray(index);
+}
+
+DELEGATE_TO_GL(finish, Finish)
+
+DELEGATE_TO_GL(flush, Flush)
+
+DELEGATE_TO_GL_4(framebufferRenderbuffer, FramebufferRenderbufferEXT, unsigned long, unsigned long, unsigned long, WebGLId)
+
+DELEGATE_TO_GL_5(framebufferTexture2D, FramebufferTexture2DEXT, unsigned long, unsigned long, unsigned long, WebGLId, long)
+
+DELEGATE_TO_GL_1(frontFace, FrontFace, unsigned long)
+
+void WebGraphicsContext3DDefaultImpl::generateMipmap(unsigned long target)
+{
+ makeContextCurrent();
+ if (m_isGLES2 || m_haveEXTFramebufferObject)
+ glGenerateMipmapEXT(target);
+ // FIXME: provide alternative code path? This will be unpleasant
+ // to implement if glGenerateMipmapEXT is not available -- it will
+ // require a texture readback and re-upload.
+}
+
+bool WebGraphicsContext3DDefaultImpl::getActiveAttrib(WebGLId program, unsigned long index, ActiveInfo& info)
+{
+ makeContextCurrent();
+ if (!program) {
+ synthesizeGLError(GL_INVALID_VALUE);
+ return false;
+ }
+ GLint maxNameLength = -1;
+ glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxNameLength);
+ if (maxNameLength < 0)
+ return false;
+ GLchar* name = 0;
+ if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) {
+ synthesizeGLError(GL_OUT_OF_MEMORY);
+ return false;
+ }
+ GLsizei length = 0;
+ GLint size = -1;
+ GLenum type = 0;
+ glGetActiveAttrib(program, index, maxNameLength,
+ &length, &size, &type, name);
+ if (size < 0) {
+ fastFree(name);
+ return false;
+ }
+ info.name = WebString::fromUTF8(name, length);
+ info.type = type;
+ info.size = size;
+ fastFree(name);
+ return true;
+}
+
+bool WebGraphicsContext3DDefaultImpl::getActiveUniform(WebGLId program, unsigned long index, ActiveInfo& info)
+{
+ makeContextCurrent();
+ GLint maxNameLength = -1;
+ glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength);
+ if (maxNameLength < 0)
+ return false;
+ GLchar* name = 0;
+ if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) {
+ synthesizeGLError(GL_OUT_OF_MEMORY);
+ return false;
+ }
+ GLsizei length = 0;
+ GLint size = -1;
+ GLenum type = 0;
+ glGetActiveUniform(program, index, maxNameLength,
+ &length, &size, &type, name);
+ if (size < 0) {
+ fastFree(name);
+ return false;
+ }
+ info.name = WebString::fromUTF8(name, length);
+ info.type = type;
+ info.size = size;
+ fastFree(name);
+ return true;
+}
+
+DELEGATE_TO_GL_4(getAttachedShaders, GetAttachedShaders, WebGLId, int, int*, unsigned int*)
+
+DELEGATE_TO_GL_2R(getAttribLocation, GetAttribLocation, WebGLId, const char*, int)
+
+DELEGATE_TO_GL_2(getBooleanv, GetBooleanv, unsigned long, unsigned char*)
+
+DELEGATE_TO_GL_3(getBufferParameteriv, GetBufferParameteriv, unsigned long, unsigned long, int*)
+
+WebGraphicsContext3D::Attributes WebGraphicsContext3DDefaultImpl::getContextAttributes()
+{
+ return m_attributes;
+}
+
+unsigned long WebGraphicsContext3DDefaultImpl::getError()
+{
+ if (m_syntheticErrors.size() > 0) {
+ ListHashSet<unsigned long>::iterator iter = m_syntheticErrors.begin();
+ unsigned long err = *iter;
+ m_syntheticErrors.remove(iter);
+ return err;
+ }
+
+ makeContextCurrent();
+ return glGetError();
+}
+
+bool WebGraphicsContext3DDefaultImpl::isContextLost()
+{
+ return false;
+}
+
+DELEGATE_TO_GL_2(getFloatv, GetFloatv, unsigned long, float*)
+
+void WebGraphicsContext3DDefaultImpl::getFramebufferAttachmentParameteriv(unsigned long target, unsigned long attachment,
+ unsigned long pname, int* value)
+{
+ makeContextCurrent();
+ if (attachment == GL_DEPTH_STENCIL_ATTACHMENT)
+ attachment = GL_DEPTH_ATTACHMENT; // Or GL_STENCIL_ATTACHMENT, either works.
+ glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, value);
+}
+
+void WebGraphicsContext3DDefaultImpl::getIntegerv(unsigned long pname, int* value)
+{
+ makeContextCurrent();
+ if (m_isGLES2) {
+ glGetIntegerv(pname, value);
+ return;
+ }
+ // Need to emulate MAX_FRAGMENT/VERTEX_UNIFORM_VECTORS and MAX_VARYING_VECTORS
+ // because desktop GL's corresponding queries return the number of components
+ // whereas GLES2 return the number of vectors (each vector has 4 components).
+ // Therefore, the value returned by desktop GL needs to be divided by 4.
+ switch (pname) {
+ case MAX_FRAGMENT_UNIFORM_VECTORS:
+ glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, value);
+ *value /= 4;
+ break;
+ case MAX_VERTEX_UNIFORM_VECTORS:
+ glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, value);
+ *value /= 4;
+ break;
+ case MAX_VARYING_VECTORS:
+ glGetIntegerv(GL_MAX_VARYING_FLOATS, value);
+ *value /= 4;
+ break;
+ default:
+ glGetIntegerv(pname, value);
+ }
+}
+
+DELEGATE_TO_GL_3(getProgramiv, GetProgramiv, WebGLId, unsigned long, int*)
+
+WebString WebGraphicsContext3DDefaultImpl::getProgramInfoLog(WebGLId program)
+{
+ makeContextCurrent();
+ GLint logLength;
+ glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
+ if (!logLength)
+ return WebString();
+ GLchar* log = 0;
+ if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log))
+ return WebString();
+ GLsizei returnedLogLength;
+ glGetProgramInfoLog(program, logLength, &returnedLogLength, log);
+ ASSERT(logLength == returnedLogLength + 1);
+ WebString res = WebString::fromUTF8(log, returnedLogLength);
+ fastFree(log);
+ return res;
+}
+
+DELEGATE_TO_GL_3(getRenderbufferParameteriv, GetRenderbufferParameterivEXT, unsigned long, unsigned long, int*)
+
+void WebGraphicsContext3DDefaultImpl::getShaderiv(WebGLId shader, unsigned long pname, int* value)
+{
+ makeContextCurrent();
+
+ ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader);
+ if (result != m_shaderSourceMap.end()) {
+ ShaderSourceEntry* entry = result->second;
+ ASSERT(entry);
+ switch (pname) {
+ case GL_COMPILE_STATUS:
+ if (!entry->isValid) {
+ *value = 0;
+ return;
+ }
+ break;
+ case GL_INFO_LOG_LENGTH:
+ if (!entry->isValid) {
+ *value = entry->log ? strlen(entry->log) : 0;
+ if (*value)
+ (*value)++;
+ return;
+ }
+ break;
+ case GL_SHADER_SOURCE_LENGTH:
+ *value = entry->source ? strlen(entry->source) : 0;
+ if (*value)
+ (*value)++;
+ return;
+ }
+ }
+
+ glGetShaderiv(shader, pname, value);
+}
+
+WebString WebGraphicsContext3DDefaultImpl::getShaderInfoLog(WebGLId shader)
+{
+ makeContextCurrent();
+
+ ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader);
+ if (result != m_shaderSourceMap.end()) {
+ ShaderSourceEntry* entry = result->second;
+ ASSERT(entry);
+ if (!entry->isValid) {
+ if (!entry->log)
+ return WebString();
+ WebString res = WebString::fromUTF8(entry->log, strlen(entry->log));
+ return res;
+ }
+ }
+
+ GLint logLength = 0;
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
+ if (logLength <= 1)
+ return WebString();
+ GLchar* log = 0;
+ if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log))
+ return WebString();
+ GLsizei returnedLogLength;
+ glGetShaderInfoLog(shader, logLength, &returnedLogLength, log);
+ ASSERT(logLength == returnedLogLength + 1);
+ WebString res = WebString::fromUTF8(log, returnedLogLength);
+ fastFree(log);
+ return res;
+}
+
+WebString WebGraphicsContext3DDefaultImpl::getShaderSource(WebGLId shader)
+{
+ makeContextCurrent();
+
+ ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader);
+ if (result != m_shaderSourceMap.end()) {
+ ShaderSourceEntry* entry = result->second;
+ ASSERT(entry);
+ if (!entry->source)
+ return WebString();
+ WebString res = WebString::fromUTF8(entry->source, strlen(entry->source));
+ return res;
+ }
+
+ GLint logLength = 0;
+ glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &logLength);
+ if (logLength <= 1)
+ return WebString();
+ GLchar* log = 0;
+ if (!tryFastMalloc(logLength * sizeof(GLchar)).getValue(log))
+ return WebString();
+ GLsizei returnedLogLength;
+ glGetShaderSource(shader, logLength, &returnedLogLength, log);
+ ASSERT(logLength == returnedLogLength + 1);
+ WebString res = WebString::fromUTF8(log, returnedLogLength);
+ fastFree(log);
+ return res;
+}
+
+WebString WebGraphicsContext3DDefaultImpl::getString(unsigned long name)
+{
+ makeContextCurrent();
+ StringBuilder result;
+ result.append(reinterpret_cast<const char*>(glGetString(name)));
+ if (name == GL_EXTENSIONS) {
+ // GL_CHROMIUM_copy_texture_to_parent_texture requires the
+ // desktopGL-only function glGetTexLevelParameteriv (GLES2
+ // doesn't support it).
+ if (!m_isGLES2)
+ result.append(" GL_CHROMIUM_copy_texture_to_parent_texture");
+ }
+ return WebString(result.toString());
+}
+
+DELEGATE_TO_GL_3(getTexParameterfv, GetTexParameterfv, unsigned long, unsigned long, float*)
+
+DELEGATE_TO_GL_3(getTexParameteriv, GetTexParameteriv, unsigned long, unsigned long, int*)
+
+DELEGATE_TO_GL_3(getUniformfv, GetUniformfv, WebGLId, long, float*)
+
+DELEGATE_TO_GL_3(getUniformiv, GetUniformiv, WebGLId, long, int*)
+
+DELEGATE_TO_GL_2R(getUniformLocation, GetUniformLocation, WebGLId, const char*, long)
+
+DELEGATE_TO_GL_3(getVertexAttribfv, GetVertexAttribfv, unsigned long, unsigned long, float*)
+
+DELEGATE_TO_GL_3(getVertexAttribiv, GetVertexAttribiv, unsigned long, unsigned long, int*)
+
+long WebGraphicsContext3DDefaultImpl::getVertexAttribOffset(unsigned long index, unsigned long pname)
+{
+ makeContextCurrent();
+ void* pointer;
+ glGetVertexAttribPointerv(index, pname, &pointer);
+ return reinterpret_cast<long>(pointer);
+}
+
+DELEGATE_TO_GL_2(hint, Hint, unsigned long, unsigned long)
+
+DELEGATE_TO_GL_1R(isBuffer, IsBuffer, WebGLId, bool)
+
+DELEGATE_TO_GL_1R(isEnabled, IsEnabled, unsigned long, bool)
+
+DELEGATE_TO_GL_1R(isFramebuffer, IsFramebufferEXT, WebGLId, bool)
+
+DELEGATE_TO_GL_1R(isProgram, IsProgram, WebGLId, bool)
+
+DELEGATE_TO_GL_1R(isRenderbuffer, IsRenderbufferEXT, WebGLId, bool)
+
+DELEGATE_TO_GL_1R(isShader, IsShader, WebGLId, bool)
+
+DELEGATE_TO_GL_1R(isTexture, IsTexture, WebGLId, bool)
+
+DELEGATE_TO_GL_1(lineWidth, LineWidth, double)
+
+DELEGATE_TO_GL_1(linkProgram, LinkProgram, WebGLId)
+
+DELEGATE_TO_GL_2(pixelStorei, PixelStorei, unsigned long, long)
+
+DELEGATE_TO_GL_2(polygonOffset, PolygonOffset, double, double)
+
+void WebGraphicsContext3DDefaultImpl::readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* pixels)
+{
+ makeContextCurrent();
+ // FIXME: remove the two glFlush calls when the driver bug is fixed, i.e.,
+ // all previous rendering calls should be done before reading pixels.
+ glFlush();
+ bool needsResolve = (m_attributes.antialias && m_boundFBO == m_multisampleFBO);
+ if (needsResolve) {
+ resolveMultisampledFramebuffer(x, y, width, height);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+ glFlush();
+ }
+
+ glReadPixels(x, y, width, height, format, type, pixels);
+
+ if (needsResolve)
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
+}
+
+void WebGraphicsContext3DDefaultImpl::releaseShaderCompiler()
+{
+}
+
+void WebGraphicsContext3DDefaultImpl::renderbufferStorage(unsigned long target,
+ unsigned long internalformat,
+ unsigned long width,
+ unsigned long height)
+{
+ makeContextCurrent();
+ switch (internalformat) {
+ case GL_DEPTH_STENCIL:
+ internalformat = GL_DEPTH24_STENCIL8_EXT;
+ break;
+ case GL_DEPTH_COMPONENT16:
+ internalformat = GL_DEPTH_COMPONENT;
+ break;
+ case GL_RGBA4:
+ case GL_RGB5_A1:
+ internalformat = GL_RGBA;
+ break;
+ case 0x8D62: // GL_RGB565
+ internalformat = GL_RGB;
+ break;
+ }
+ glRenderbufferStorageEXT(target, internalformat, width, height);
+}
+
+DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, double, bool)
+
+DELEGATE_TO_GL_4(scissor, Scissor, long, long, unsigned long, unsigned long)
+
+unsigned bytesPerComponent(unsigned type)
+{
+ switch (type) {
+ case GL_BYTE:
+ case GL_UNSIGNED_BYTE:
+ return 1;
+ case GL_SHORT:
+ case GL_UNSIGNED_SHORT:
+ case GL_UNSIGNED_SHORT_5_6_5:
+ case GL_UNSIGNED_SHORT_4_4_4_4:
+ case GL_UNSIGNED_SHORT_5_5_5_1:
+ return 2;
+ case GL_FLOAT:
+ return 4;
+ default:
+ return 4;
+ }
+}
+
+unsigned componentsPerPixel(unsigned format, unsigned type)
+{
+ switch (type) {
+ case GL_UNSIGNED_SHORT_5_6_5:
+ case GL_UNSIGNED_SHORT_4_4_4_4:
+ case GL_UNSIGNED_SHORT_5_5_5_1:
+ return 1;
+ default:
+ break;
+ }
+ switch (format) {
+ case GL_LUMINANCE:
+ return 1;
+ case GL_LUMINANCE_ALPHA:
+ return 2;
+ case GL_RGB:
+ return 3;
+ case GL_RGBA:
+ case GL_BGRA_EXT:
+ return 4;
+ default:
+ return 4;
+ }
+}
+
+// N.B.: This code does not protect against integer overflow (as the command
+// buffer implementation does), so it should not be considered robust enough
+// for use in the browser. Since this implementation is only used for layout
+// tests, this should be ok for now.
+size_t imageSizeInBytes(unsigned width, unsigned height, unsigned format, unsigned type)
+{
+ return width * height * bytesPerComponent(type) * componentsPerPixel(format, type);
+}
+
+void WebGraphicsContext3DDefaultImpl::texImage2D(unsigned target, unsigned level, unsigned internalFormat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, const void* pixels)
+{
+ OwnArrayPtr<uint8> zero;
+ if (!pixels) {
+ size_t size = imageSizeInBytes(width, height, format, type);
+ zero.set(new uint8[size]);
+ memset(zero.get(), 0, size);
+ pixels = zero.get();
+ }
+ glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
+}
+
+void WebGraphicsContext3DDefaultImpl::shaderSource(WebGLId shader, const char* string)
+{
+ makeContextCurrent();
+ GLint length = string ? strlen(string) : 0;
+ ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader);
+ if (result != m_shaderSourceMap.end()) {
+ ShaderSourceEntry* entry = result->second;
+ ASSERT(entry);
+ if (entry->source) {
+ fastFree(entry->source);
+ entry->source = 0;
+ }
+ if (!tryFastMalloc((length + 1) * sizeof(char)).getValue(entry->source))
+ return; // FIXME: generate an error?
+ memcpy(entry->source, string, (length + 1) * sizeof(char));
+ } else
+ glShaderSource(shader, 1, &string, &length);
+}
+
+DELEGATE_TO_GL_3(stencilFunc, StencilFunc, unsigned long, long, unsigned long)
+
+DELEGATE_TO_GL_4(stencilFuncSeparate, StencilFuncSeparate, unsigned long, unsigned long, long, unsigned long)
+
+DELEGATE_TO_GL_1(stencilMask, StencilMask, unsigned long)
+
+DELEGATE_TO_GL_2(stencilMaskSeparate, StencilMaskSeparate, unsigned long, unsigned long)
+
+DELEGATE_TO_GL_3(stencilOp, StencilOp, unsigned long, unsigned long, unsigned long)
+
+DELEGATE_TO_GL_4(stencilOpSeparate, StencilOpSeparate, unsigned long, unsigned long, unsigned long, unsigned long)
+
+DELEGATE_TO_GL_3(texParameterf, TexParameterf, unsigned, unsigned, float);
+
+DELEGATE_TO_GL_3(texParameteri, TexParameteri, unsigned, unsigned, int);
+
+DELEGATE_TO_GL_9(texSubImage2D, TexSubImage2D, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, const void*)
+
+DELEGATE_TO_GL_2(uniform1f, Uniform1f, long, float)
+
+DELEGATE_TO_GL_3(uniform1fv, Uniform1fv, long, int, float*)
+
+DELEGATE_TO_GL_2(uniform1i, Uniform1i, long, int)
+
+DELEGATE_TO_GL_3(uniform1iv, Uniform1iv, long, int, int*)
+
+DELEGATE_TO_GL_3(uniform2f, Uniform2f, long, float, float)
+
+DELEGATE_TO_GL_3(uniform2fv, Uniform2fv, long, int, float*)
+
+DELEGATE_TO_GL_3(uniform2i, Uniform2i, long, int, int)
+
+DELEGATE_TO_GL_3(uniform2iv, Uniform2iv, long, int, int*)
+
+DELEGATE_TO_GL_4(uniform3f, Uniform3f, long, float, float, float)
+
+DELEGATE_TO_GL_3(uniform3fv, Uniform3fv, long, int, float*)
+
+DELEGATE_TO_GL_4(uniform3i, Uniform3i, long, int, int, int)
+
+DELEGATE_TO_GL_3(uniform3iv, Uniform3iv, long, int, int*)
+
+DELEGATE_TO_GL_5(uniform4f, Uniform4f, long, float, float, float, float)
+
+DELEGATE_TO_GL_3(uniform4fv, Uniform4fv, long, int, float*)
+
+DELEGATE_TO_GL_5(uniform4i, Uniform4i, long, int, int, int, int)
+
+DELEGATE_TO_GL_3(uniform4iv, Uniform4iv, long, int, int*)
+
+DELEGATE_TO_GL_4(uniformMatrix2fv, UniformMatrix2fv, long, int, bool, const float*)
+
+DELEGATE_TO_GL_4(uniformMatrix3fv, UniformMatrix3fv, long, int, bool, const float*)
+
+DELEGATE_TO_GL_4(uniformMatrix4fv, UniformMatrix4fv, long, int, bool, const float*)
+
+DELEGATE_TO_GL_1(useProgram, UseProgram, WebGLId)
+
+DELEGATE_TO_GL_1(validateProgram, ValidateProgram, WebGLId)
+
+DELEGATE_TO_GL_2(vertexAttrib1f, VertexAttrib1f, unsigned long, float)
+
+DELEGATE_TO_GL_2(vertexAttrib1fv, VertexAttrib1fv, unsigned long, const float*)
+
+DELEGATE_TO_GL_3(vertexAttrib2f, VertexAttrib2f, unsigned long, float, float)
+
+DELEGATE_TO_GL_2(vertexAttrib2fv, VertexAttrib2fv, unsigned long, const float*)
+
+DELEGATE_TO_GL_4(vertexAttrib3f, VertexAttrib3f, unsigned long, float, float, float)
+
+DELEGATE_TO_GL_2(vertexAttrib3fv, VertexAttrib3fv, unsigned long, const float*)
+
+DELEGATE_TO_GL_5(vertexAttrib4f, VertexAttrib4f, unsigned long, float, float, float, float)
+
+DELEGATE_TO_GL_2(vertexAttrib4fv, VertexAttrib4fv, unsigned long, const float*)
+
+void WebGraphicsContext3DDefaultImpl::vertexAttribPointer(unsigned long indx, int size, int type, bool normalized,
+ unsigned long stride, unsigned long offset)
+{
+ makeContextCurrent();
+
+ if (m_boundArrayBuffer <= 0) {
+ // FIXME: raise exception.
+ // LogMessagef(("bufferData: no buffer bound"));
+ return;
+ }
+
+ if (indx < NumTrackedPointerStates) {
+ VertexAttribPointerState& state = m_vertexAttribPointerState[indx];
+ state.buffer = m_boundArrayBuffer;
+ state.indx = indx;
+ state.size = size;
+ state.type = type;
+ state.normalized = normalized;
+ state.stride = stride;
+ state.offset = offset;
+ }
+
+ glVertexAttribPointer(indx, size, type, normalized, stride,
+ reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
+}
+
+DELEGATE_TO_GL_4(viewport, Viewport, long, long, unsigned long, unsigned long)
+
+unsigned WebGraphicsContext3DDefaultImpl::createBuffer()
+{
+ makeContextCurrent();
+ GLuint o;
+ glGenBuffersARB(1, &o);
+ return o;
+}
+
+unsigned WebGraphicsContext3DDefaultImpl::createFramebuffer()
+{
+ makeContextCurrent();
+ GLuint o = 0;
+ glGenFramebuffersEXT(1, &o);
+ return o;
+}
+
+unsigned WebGraphicsContext3DDefaultImpl::createProgram()
+{
+ makeContextCurrent();
+ return glCreateProgram();
+}
+
+unsigned WebGraphicsContext3DDefaultImpl::createRenderbuffer()
+{
+ makeContextCurrent();
+ GLuint o;
+ glGenRenderbuffersEXT(1, &o);
+ return o;
+}
+
+unsigned WebGraphicsContext3DDefaultImpl::createShader(unsigned long shaderType)
+{
+ makeContextCurrent();
+ ASSERT(shaderType == GL_VERTEX_SHADER || shaderType == GL_FRAGMENT_SHADER);
+ unsigned shader = glCreateShader(shaderType);
+ if (shader) {
+ ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader);
+ if (result != m_shaderSourceMap.end())
+ delete result->second;
+ m_shaderSourceMap.set(shader, new ShaderSourceEntry(shaderType));
+ }
+
+ return shader;
+}
+
+unsigned WebGraphicsContext3DDefaultImpl::createTexture()
+{
+ makeContextCurrent();
+ GLuint o;
+ glGenTextures(1, &o);
+ return o;
+}
+
+void WebGraphicsContext3DDefaultImpl::deleteBuffer(unsigned buffer)
+{
+ makeContextCurrent();
+ glDeleteBuffersARB(1, &buffer);
+}
+
+void WebGraphicsContext3DDefaultImpl::deleteFramebuffer(unsigned framebuffer)
+{
+ makeContextCurrent();
+ glDeleteFramebuffersEXT(1, &framebuffer);
+}
+
+void WebGraphicsContext3DDefaultImpl::deleteProgram(unsigned program)
+{
+ makeContextCurrent();
+ glDeleteProgram(program);
+}
+
+void WebGraphicsContext3DDefaultImpl::deleteRenderbuffer(unsigned renderbuffer)
+{
+ makeContextCurrent();
+ glDeleteRenderbuffersEXT(1, &renderbuffer);
+}
+
+void WebGraphicsContext3DDefaultImpl::deleteShader(unsigned shader)
+{
+ makeContextCurrent();
+
+ ShaderSourceMap::iterator result = m_shaderSourceMap.find(shader);
+ if (result != m_shaderSourceMap.end())
+ delete result->second;
+ m_shaderSourceMap.remove(result);
+ glDeleteShader(shader);
+}
+
+void WebGraphicsContext3DDefaultImpl::deleteTexture(unsigned texture)
+{
+ makeContextCurrent();
+ glDeleteTextures(1, &texture);
+}
+
+bool WebGraphicsContext3DDefaultImpl::angleCreateCompilers()
+{
+ if (!ShInitialize())
+ return false;
+
+ ShBuiltInResources resources;
+ ShInitBuiltInResources(&resources);
+ getIntegerv(GL_MAX_VERTEX_ATTRIBS, &resources.MaxVertexAttribs);
+ getIntegerv(MAX_VERTEX_UNIFORM_VECTORS, &resources.MaxVertexUniformVectors);
+ getIntegerv(MAX_VARYING_VECTORS, &resources.MaxVaryingVectors);
+ getIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &resources.MaxVertexTextureImageUnits);
+ getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &resources.MaxCombinedTextureImageUnits);
+ getIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &resources.MaxTextureImageUnits);
+ getIntegerv(MAX_FRAGMENT_UNIFORM_VECTORS, &resources.MaxFragmentUniformVectors);
+ // Always set to 1 for OpenGL ES.
+ resources.MaxDrawBuffers = 1;
+
+ m_fragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, SH_WEBGL_SPEC, &resources);
+ m_vertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, SH_WEBGL_SPEC, &resources);
+ return (m_fragmentCompiler && m_vertexCompiler);
+}
+
+void WebGraphicsContext3DDefaultImpl::angleDestroyCompilers()
+{
+ if (m_fragmentCompiler) {
+ ShDestruct(m_fragmentCompiler);
+ m_fragmentCompiler = 0;
+ }
+ if (m_vertexCompiler) {
+ ShDestruct(m_vertexCompiler);
+ m_vertexCompiler = 0;
+ }
+}
+
+bool WebGraphicsContext3DDefaultImpl::angleValidateShaderSource(ShaderSourceEntry& entry)
+{
+ entry.isValid = false;
+ if (entry.translatedSource) {
+ fastFree(entry.translatedSource);
+ entry.translatedSource = 0;
+ }
+ if (entry.log) {
+ fastFree(entry.log);
+ entry.log = 0;
+ }
+
+ ShHandle compiler = 0;
+ switch (entry.type) {
+ case GL_FRAGMENT_SHADER:
+ compiler = m_fragmentCompiler;
+ break;
+ case GL_VERTEX_SHADER:
+ compiler = m_vertexCompiler;
+ break;
+ }
+ if (!compiler)
+ return false;
+
+ if (!ShCompile(compiler, &entry.source, 1, SH_OBJECT_CODE)) {
+ int logSize = 0;
+ ShGetInfo(compiler, SH_INFO_LOG_LENGTH, &logSize);
+ if (logSize > 1 && tryFastMalloc(logSize * sizeof(char)).getValue(entry.log))
+ ShGetInfoLog(compiler, entry.log);
+ return false;
+ }
+
+ int length = 0;
+ if (m_isGLES2) {
+ // ANGLE does not yet have a GLSL ES backend. Therefore if the
+ // compile succeeds we send the original source down.
+ length = strlen(entry.source);
+ if (length > 0)
+ ++length; // Add null terminator
+ } else
+ ShGetInfo(compiler, SH_OBJECT_CODE_LENGTH, &length);
+ if (length > 1) {
+ if (!tryFastMalloc(length * sizeof(char)).getValue(entry.translatedSource))
+ return false;
+ if (m_isGLES2)
+ strncpy(entry.translatedSource, entry.source, length);
+ else
+ ShGetObjectCode(compiler, entry.translatedSource);
+ }
+ entry.isValid = true;
+ return true;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(3D_CANVAS)
diff --git a/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.h b/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.h
new file mode 100644
index 0000000..32e3671
--- /dev/null
+++ b/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.h
@@ -0,0 +1,383 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WebGraphicsContext3DDefaultImpl_h
+#define WebGraphicsContext3DDefaultImpl_h
+
+#if ENABLE(3D_CANVAS)
+
+#include "GLSLANG/ShaderLang.h"
+#include "WebGraphicsContext3D.h"
+
+#include <wtf/HashMap.h>
+#include <wtf/ListHashSet.h>
+#include <wtf/OwnPtr.h>
+
+#if !PLATFORM(CG)
+#define FLIP_FRAMEBUFFER_VERTICALLY
+#endif
+namespace gfx {
+class GLContext;
+}
+
+namespace WebKit {
+
+// The default implementation of WebGL. In Chromium, using this class
+// requires the sandbox to be disabled, which is strongly discouraged.
+// It is provided for support of test_shell and any Chromium ports
+// where an in-renderer WebGL implementation would be helpful.
+
+class WebGraphicsContext3DDefaultImpl : public WebGraphicsContext3D {
+public:
+ WebGraphicsContext3DDefaultImpl();
+ virtual ~WebGraphicsContext3DDefaultImpl();
+
+ //----------------------------------------------------------------------
+ // WebGraphicsContext3D methods
+ virtual bool initialize(WebGraphicsContext3D::Attributes attributes, WebView*, bool);
+ virtual bool makeContextCurrent();
+
+ virtual int width();
+ virtual int height();
+
+ virtual int sizeInBytes(int type);
+
+ virtual bool isGLES2Compliant();
+
+ virtual void reshape(int width, int height);
+
+ virtual bool readBackFramebuffer(unsigned char* pixels, size_t bufferSize);
+
+ virtual unsigned int getPlatformTextureId();
+ virtual void prepareTexture();
+
+ virtual void synthesizeGLError(unsigned long error);
+ virtual void* mapBufferSubDataCHROMIUM(unsigned target, int offset, int size, unsigned access);
+ virtual void unmapBufferSubDataCHROMIUM(const void*);
+ virtual void* mapTexSubImage2DCHROMIUM(unsigned target, int level, int xoffset, int yoffset, int width, int height, unsigned format, unsigned type, unsigned access);
+ virtual void unmapTexSubImage2DCHROMIUM(const void*);
+ virtual void copyTextureToParentTextureCHROMIUM(unsigned texture, unsigned parentTexture);
+
+ virtual void activeTexture(unsigned long texture);
+ virtual void attachShader(WebGLId program, WebGLId shader);
+ virtual void bindAttribLocation(WebGLId program, unsigned long index, const char* name);
+ virtual void bindBuffer(unsigned long target, WebGLId buffer);
+ virtual void bindFramebuffer(unsigned long target, WebGLId framebuffer);
+ virtual void bindRenderbuffer(unsigned long target, WebGLId renderbuffer);
+ virtual void bindTexture(unsigned long target, WebGLId texture);
+ virtual void blendColor(double red, double green, double blue, double alpha);
+ virtual void blendEquation(unsigned long mode);
+ virtual void blendEquationSeparate(unsigned long modeRGB, unsigned long modeAlpha);
+ virtual void blendFunc(unsigned long sfactor, unsigned long dfactor);
+ virtual void blendFuncSeparate(unsigned long srcRGB, unsigned long dstRGB, unsigned long srcAlpha, unsigned long dstAlpha);
+
+ virtual void bufferData(unsigned long target, int size, const void* data, unsigned long usage);
+ virtual void bufferSubData(unsigned long target, long offset, int size, const void* data);
+
+ virtual unsigned long checkFramebufferStatus(unsigned long target);
+ virtual void clear(unsigned long mask);
+ virtual void clearColor(double red, double green, double blue, double alpha);
+ virtual void clearDepth(double depth);
+ virtual void clearStencil(long s);
+ virtual void colorMask(bool red, bool green, bool blue, bool alpha);
+ virtual void compileShader(WebGLId shader);
+
+ virtual void copyTexImage2D(unsigned long target, long level, unsigned long internalformat, long x, long y, unsigned long width, unsigned long height, long border);
+ virtual void copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, long x, long y, unsigned long width, unsigned long height);
+ virtual void cullFace(unsigned long mode);
+ virtual void depthFunc(unsigned long func);
+ virtual void depthMask(bool flag);
+ virtual void depthRange(double zNear, double zFar);
+ virtual void detachShader(WebGLId program, WebGLId shader);
+ virtual void disable(unsigned long cap);
+ virtual void disableVertexAttribArray(unsigned long index);
+ virtual void drawArrays(unsigned long mode, long first, long count);
+ virtual void drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset);
+
+ virtual void enable(unsigned long cap);
+ virtual void enableVertexAttribArray(unsigned long index);
+ virtual void finish();
+ virtual void flush();
+ virtual void framebufferRenderbuffer(unsigned long target, unsigned long attachment, unsigned long renderbuffertarget, WebGLId renderbuffer);
+ virtual void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, WebGLId texture, long level);
+ virtual void frontFace(unsigned long mode);
+ virtual void generateMipmap(unsigned long target);
+
+ virtual bool getActiveAttrib(WebGLId program, unsigned long index, ActiveInfo&);
+ virtual bool getActiveUniform(WebGLId program, unsigned long index, ActiveInfo&);
+
+ virtual void getAttachedShaders(WebGLId program, int maxCount, int* count, unsigned int* shaders);
+
+ virtual int getAttribLocation(WebGLId program, const char* name);
+
+ virtual void getBooleanv(unsigned long pname, unsigned char* value);
+
+ virtual void getBufferParameteriv(unsigned long target, unsigned long pname, int* value);
+
+ virtual Attributes getContextAttributes();
+
+ virtual unsigned long getError();
+
+ virtual bool isContextLost();
+
+ virtual void getFloatv(unsigned long pname, float* value);
+
+ virtual void getFramebufferAttachmentParameteriv(unsigned long target, unsigned long attachment, unsigned long pname, int* value);
+
+ virtual void getIntegerv(unsigned long pname, int* value);
+
+ virtual void getProgramiv(WebGLId program, unsigned long pname, int* value);
+
+ virtual WebString getProgramInfoLog(WebGLId program);
+
+ virtual void getRenderbufferParameteriv(unsigned long target, unsigned long pname, int* value);
+
+ virtual void getShaderiv(WebGLId shader, unsigned long pname, int* value);
+
+ virtual WebString getShaderInfoLog(WebGLId shader);
+
+ // TBD
+ // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+
+ virtual WebString getShaderSource(WebGLId shader);
+ virtual WebString getString(unsigned long name);
+
+ virtual void getTexParameterfv(unsigned long target, unsigned long pname, float* value);
+ virtual void getTexParameteriv(unsigned long target, unsigned long pname, int* value);
+
+ virtual void getUniformfv(WebGLId program, long location, float* value);
+ virtual void getUniformiv(WebGLId program, long location, int* value);
+
+ virtual long getUniformLocation(WebGLId program, const char* name);
+
+ virtual void getVertexAttribfv(unsigned long index, unsigned long pname, float* value);
+ virtual void getVertexAttribiv(unsigned long index, unsigned long pname, int* value);
+
+ virtual long getVertexAttribOffset(unsigned long index, unsigned long pname);
+
+ virtual void hint(unsigned long target, unsigned long mode);
+ virtual bool isBuffer(WebGLId buffer);
+ virtual bool isEnabled(unsigned long cap);
+ virtual bool isFramebuffer(WebGLId framebuffer);
+ virtual bool isProgram(WebGLId program);
+ virtual bool isRenderbuffer(WebGLId renderbuffer);
+ virtual bool isShader(WebGLId shader);
+ virtual bool isTexture(WebGLId texture);
+ virtual void lineWidth(double);
+ virtual void linkProgram(WebGLId program);
+ virtual void pixelStorei(unsigned long pname, long param);
+ virtual void polygonOffset(double factor, double units);
+
+ virtual void readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* pixels);
+
+ virtual void releaseShaderCompiler();
+ virtual void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height);
+ virtual void sampleCoverage(double value, bool invert);
+ virtual void scissor(long x, long y, unsigned long width, unsigned long height);
+ virtual void shaderSource(WebGLId shader, const char* string);
+ virtual void stencilFunc(unsigned long func, long ref, unsigned long mask);
+ virtual void stencilFuncSeparate(unsigned long face, unsigned long func, long ref, unsigned long mask);
+ virtual void stencilMask(unsigned long mask);
+ virtual void stencilMaskSeparate(unsigned long face, unsigned long mask);
+ virtual void stencilOp(unsigned long fail, unsigned long zfail, unsigned long zpass);
+ virtual void stencilOpSeparate(unsigned long face, unsigned long fail, unsigned long zfail, unsigned long zpass);
+
+ virtual void texImage2D(unsigned target, unsigned level, unsigned internalformat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, const void* pixels);
+
+ virtual void texParameterf(unsigned target, unsigned pname, float param);
+ virtual void texParameteri(unsigned target, unsigned pname, int param);
+
+ virtual void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, unsigned format, unsigned type, const void* pixels);
+
+ virtual void uniform1f(long location, float x);
+ virtual void uniform1fv(long location, int count, float* v);
+ virtual void uniform1i(long location, int x);
+ virtual void uniform1iv(long location, int count, int* v);
+ virtual void uniform2f(long location, float x, float y);
+ virtual void uniform2fv(long location, int count, float* v);
+ virtual void uniform2i(long location, int x, int y);
+ virtual void uniform2iv(long location, int count, int* v);
+ virtual void uniform3f(long location, float x, float y, float z);
+ virtual void uniform3fv(long location, int count, float* v);
+ virtual void uniform3i(long location, int x, int y, int z);
+ virtual void uniform3iv(long location, int count, int* v);
+ virtual void uniform4f(long location, float x, float y, float z, float w);
+ virtual void uniform4fv(long location, int count, float* v);
+ virtual void uniform4i(long location, int x, int y, int z, int w);
+ virtual void uniform4iv(long location, int count, int* v);
+ virtual void uniformMatrix2fv(long location, int count, bool transpose, const float* value);
+ virtual void uniformMatrix3fv(long location, int count, bool transpose, const float* value);
+ virtual void uniformMatrix4fv(long location, int count, bool transpose, const float* value);
+
+ virtual void useProgram(WebGLId program);
+ virtual void validateProgram(WebGLId program);
+
+ virtual void vertexAttrib1f(unsigned long indx, float x);
+ virtual void vertexAttrib1fv(unsigned long indx, const float* values);
+ virtual void vertexAttrib2f(unsigned long indx, float x, float y);
+ virtual void vertexAttrib2fv(unsigned long indx, const float* values);
+ virtual void vertexAttrib3f(unsigned long indx, float x, float y, float z);
+ virtual void vertexAttrib3fv(unsigned long indx, const float* values);
+ virtual void vertexAttrib4f(unsigned long indx, float x, float y, float z, float w);
+ virtual void vertexAttrib4fv(unsigned long indx, const float* values);
+ virtual void vertexAttribPointer(unsigned long indx, int size, int type, bool normalized,
+ unsigned long stride, unsigned long offset);
+
+ virtual void viewport(long x, long y, unsigned long width, unsigned long height);
+
+ // Support for buffer creation and deletion
+ virtual unsigned createBuffer();
+ virtual unsigned createFramebuffer();
+ virtual unsigned createProgram();
+ virtual unsigned createRenderbuffer();
+ virtual unsigned createShader(unsigned long);
+ virtual unsigned createTexture();
+
+ virtual void deleteBuffer(unsigned);
+ virtual void deleteFramebuffer(unsigned);
+ virtual void deleteProgram(unsigned);
+ virtual void deleteRenderbuffer(unsigned);
+ virtual void deleteShader(unsigned);
+ virtual void deleteTexture(unsigned);
+
+private:
+ WebGraphicsContext3D::Attributes m_attributes;
+ bool m_initialized;
+ bool m_renderDirectlyToWebView;
+ bool m_isGLES2;
+ bool m_haveEXTFramebufferObject;
+ bool m_haveEXTFramebufferMultisample;
+ bool m_haveANGLEFramebufferMultisample;
+
+ unsigned int m_texture;
+ unsigned int m_fbo;
+ unsigned int m_depthStencilBuffer;
+ unsigned int m_cachedWidth, m_cachedHeight;
+
+ // For multisampling
+ unsigned int m_multisampleFBO;
+ unsigned int m_multisampleDepthStencilBuffer;
+ unsigned int m_multisampleColorBuffer;
+
+ // For tracking which FBO is bound
+ unsigned int m_boundFBO;
+
+ // For tracking which texture is bound
+ unsigned int m_boundTexture;
+
+ // FBO used for copying child texture to parent texture.
+ unsigned m_copyTextureToParentTextureFBO;
+
+#ifdef FLIP_FRAMEBUFFER_VERTICALLY
+ unsigned char* m_scanline;
+ void flipVertically(unsigned char* framebuffer,
+ unsigned int width,
+ unsigned int height);
+#endif
+
+ // Take into account the user's requested context creation attributes, in
+ // particular stencil and antialias, and determine which could or could
+ // not be honored based on the capabilities of the OpenGL implementation.
+ void validateAttributes();
+
+ // Resolve the given rectangle of the multisampled framebuffer if necessary.
+ void resolveMultisampledFramebuffer(unsigned x, unsigned y, unsigned width, unsigned height);
+
+ // Note: we aren't currently using this information, but we will
+ // need to in order to verify that all enabled vertex arrays have
+ // a valid buffer bound -- to avoid crashes on certain cards.
+ unsigned int m_boundArrayBuffer;
+ struct VertexAttribPointerState {
+ VertexAttribPointerState();
+
+ bool enabled;
+ unsigned long buffer;
+ unsigned long indx;
+ int size;
+ int type;
+ bool normalized;
+ unsigned long stride;
+ unsigned long offset;
+ };
+
+ enum {
+ NumTrackedPointerStates = 2
+ };
+ VertexAttribPointerState m_vertexAttribPointerState[NumTrackedPointerStates];
+
+ // Errors raised by synthesizeGLError().
+ ListHashSet<unsigned long> m_syntheticErrors;
+
+ OwnPtr<gfx::GLContext> m_glContext;
+
+ // ANGLE related.
+ struct ShaderSourceEntry {
+ ShaderSourceEntry(unsigned long shaderType)
+ : type(shaderType)
+ , source(0)
+ , log(0)
+ , translatedSource(0)
+ , isValid(false)
+ {
+ }
+
+ ~ShaderSourceEntry()
+ {
+ if (source)
+ fastFree(source);
+ if (log)
+ fastFree(log);
+ if (translatedSource)
+ fastFree(translatedSource);
+ }
+
+ unsigned long type;
+ char* source;
+ char* log;
+ char* translatedSource;
+ bool isValid;
+ };
+
+ bool angleCreateCompilers();
+ void angleDestroyCompilers();
+ bool angleValidateShaderSource(ShaderSourceEntry& entry);
+
+ typedef HashMap<WebGLId, ShaderSourceEntry*> ShaderSourceMap;
+ ShaderSourceMap m_shaderSourceMap;
+
+ ShHandle m_fragmentCompiler;
+ ShHandle m_vertexCompiler;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(3D_CANVAS)
+
+#endif
diff --git a/WebKit/chromium/src/WebHTTPBody.cpp b/WebKit/chromium/src/WebHTTPBody.cpp
index 3d40869..f32b64f 100644
--- a/WebKit/chromium/src/WebHTTPBody.cpp
+++ b/WebKit/chromium/src/WebHTTPBody.cpp
@@ -32,7 +32,6 @@
#include "WebHTTPBody.h"
#include "FormData.h"
-#include "WebFileInfo.h"
using namespace WebCore;
@@ -74,23 +73,33 @@ bool WebHTTPBody::elementAt(size_t index, Element& result) const
const FormDataElement& element = m_private->elements()[index];
+ result.data.reset();
+ result.filePath.reset();
+ result.fileStart = 0;
+ result.fileLength = 0;
+ result.modificationTime = 0.0;
+ result.blobURL = KURL();
+
switch (element.m_type) {
case FormDataElement::data:
result.type = Element::TypeData;
result.data.assign(element.m_data.data(), element.m_data.size());
- result.filePath.reset();
- result.fileStart = 0;
- result.fileLength = 0;
- result.fileInfo.modificationTime = 0.0;
break;
case FormDataElement::encodedFile:
result.type = Element::TypeFile;
- result.data.reset();
result.filePath = element.m_filename;
- result.fileStart = 0; // FIXME: to be set from FormData.
- result.fileLength = -1; // FIXME: to be set from FormData.
- result.fileInfo.modificationTime = 0.0; // FIXME: to be set from FormData.
+#if ENABLE(BLOB)
+ result.fileStart = element.m_fileStart;
+ result.fileLength = element.m_fileLength;
+ result.modificationTime = element.m_expectedFileModificationTime;
+#endif
+ break;
+#if ENABLE(BLOB)
+ case FormDataElement::encodedBlob:
+ result.type = Element::TypeBlob;
+ result.blobURL = element.m_blobURL;
break;
+#endif
default:
ASSERT_NOT_REACHED();
return false;
@@ -113,9 +122,20 @@ void WebHTTPBody::appendFile(const WebString& filePath)
m_private->appendFile(filePath);
}
-void WebHTTPBody::appendFile(const WebString& filePath, long long fileStart, long long fileLength, const WebFileInfo& fileInfo)
+void WebHTTPBody::appendFileRange(const WebString& filePath, long long fileStart, long long fileLength, double modificationTime)
{
- // FIXME: to be implemented.
+#if ENABLE(BLOB)
+ ensureMutable();
+ m_private->appendFileRange(filePath, fileStart, fileLength, modificationTime);
+#endif
+}
+
+void WebHTTPBody::appendBlob(const WebURL& blobURL)
+{
+#if ENABLE(BLOB)
+ ensureMutable();
+ m_private->appendBlob(blobURL);
+#endif
}
long long WebHTTPBody::identifier() const
diff --git a/WebKit/chromium/src/WebHTTPLoadInfo.cpp b/WebKit/chromium/src/WebHTTPLoadInfo.cpp
new file mode 100644
index 0000000..876a489
--- /dev/null
+++ b/WebKit/chromium/src/WebHTTPLoadInfo.cpp
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebHTTPLoadInfo.h"
+
+#include "ResourceLoadInfo.h"
+#include "ResourceResponse.h"
+#include "WebHTTPHeaderVisitor.h"
+#include "WebString.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebHTTPLoadInfo::initialize()
+{
+ m_private = adoptRef(new ResourceLoadInfo());
+}
+
+void WebHTTPLoadInfo::reset()
+{
+ m_private.reset();
+}
+
+void WebHTTPLoadInfo::assign(const WebHTTPLoadInfo& r)
+{
+ m_private = r.m_private;
+}
+
+WebHTTPLoadInfo::WebHTTPLoadInfo(WTF::PassRefPtr<WebCore::ResourceLoadInfo> value)
+{
+ m_private = value;
+}
+
+WebHTTPLoadInfo::operator WTF::PassRefPtr<WebCore::ResourceLoadInfo>() const
+{
+ return m_private.get();
+}
+
+int WebHTTPLoadInfo::httpStatusCode() const
+{
+ ASSERT(!m_private.isNull());
+ return m_private->httpStatusCode;
+}
+
+void WebHTTPLoadInfo::setHTTPStatusCode(int statusCode)
+{
+ ASSERT(!m_private.isNull());
+ m_private->httpStatusCode = statusCode;
+}
+
+WebString WebHTTPLoadInfo::httpStatusText() const
+{
+ ASSERT(!m_private.isNull());
+ return m_private->httpStatusText;
+}
+
+void WebHTTPLoadInfo::setHTTPStatusText(const WebString& statusText)
+{
+ ASSERT(!m_private.isNull());
+ m_private->httpStatusText = statusText;
+}
+
+static void addHeader(HTTPHeaderMap* map, const WebString& name, const WebString& value)
+{
+ pair<HTTPHeaderMap::iterator, bool> result = map->add(name, value);
+ if (!result.second)
+ result.first->second += String("\n") + value;
+}
+
+void WebHTTPLoadInfo::addRequestHeader(const WebString& name, const WebString& value)
+{
+ ASSERT(!m_private.isNull());
+ addHeader(&m_private->requestHeaders, name, value);
+}
+
+void WebHTTPLoadInfo::addResponseHeader(const WebString& name, const WebString& value)
+{
+ ASSERT(!m_private.isNull());
+ addHeader(&m_private->responseHeaders, name, value);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebHistoryItem.cpp b/WebKit/chromium/src/WebHistoryItem.cpp
index 4ca8cc7..99ebce8 100644
--- a/WebKit/chromium/src/WebHistoryItem.cpp
+++ b/WebKit/chromium/src/WebHistoryItem.cpp
@@ -37,6 +37,7 @@
#include "WebHTTPBody.h"
#include "WebPoint.h"
+#include "WebSerializedScriptValue.h"
#include "WebString.h"
#include "WebVector.h"
@@ -44,30 +45,23 @@ using namespace WebCore;
namespace WebKit {
-class WebHistoryItemPrivate : public HistoryItem {
-};
-
void WebHistoryItem::initialize()
{
- assign(static_cast<WebHistoryItemPrivate*>(HistoryItem::create().releaseRef()));
+ m_private = HistoryItem::create();
}
void WebHistoryItem::reset()
{
- assign(0);
+ m_private.reset();
}
void WebHistoryItem::assign(const WebHistoryItem& other)
{
- WebHistoryItemPrivate* p = const_cast<WebHistoryItemPrivate*>(other.m_private);
- if (p)
- p->ref();
- assign(p);
+ m_private = other.m_private;
}
WebString WebHistoryItem::urlString() const
{
- ASSERT(!isNull());
return m_private->urlString();
}
@@ -79,7 +73,6 @@ void WebHistoryItem::setURLString(const WebString& url)
WebString WebHistoryItem::originalURLString() const
{
- ASSERT(!isNull());
return m_private->originalURLString();
}
@@ -91,7 +84,6 @@ void WebHistoryItem::setOriginalURLString(const WebString& originalURLString)
WebString WebHistoryItem::referrer() const
{
- ASSERT(!isNull());
return m_private->referrer();
}
@@ -103,7 +95,6 @@ void WebHistoryItem::setReferrer(const WebString& referrer)
WebString WebHistoryItem::target() const
{
- ASSERT(!isNull());
return m_private->target();
}
@@ -115,7 +106,6 @@ void WebHistoryItem::setTarget(const WebString& target)
WebString WebHistoryItem::parent() const
{
- ASSERT(!isNull());
return m_private->parent();
}
@@ -127,7 +117,6 @@ void WebHistoryItem::setParent(const WebString& parent)
WebString WebHistoryItem::title() const
{
- ASSERT(!isNull());
return m_private->title();
}
@@ -139,7 +128,6 @@ void WebHistoryItem::setTitle(const WebString& title)
WebString WebHistoryItem::alternateTitle() const
{
- ASSERT(!isNull());
return m_private->alternateTitle();
}
@@ -151,7 +139,6 @@ void WebHistoryItem::setAlternateTitle(const WebString& alternateTitle)
double WebHistoryItem::lastVisitedTime() const
{
- ASSERT(!isNull());
return m_private->lastVisitedTime();
}
@@ -168,7 +155,6 @@ void WebHistoryItem::setLastVisitedTime(double lastVisitedTime)
WebPoint WebHistoryItem::scrollOffset() const
{
- ASSERT(!isNull());
return m_private->scrollPoint();
}
@@ -180,7 +166,6 @@ void WebHistoryItem::setScrollOffset(const WebPoint& scrollOffset)
bool WebHistoryItem::isTargetItem() const
{
- ASSERT(!isNull());
return m_private->isTargetItem();
}
@@ -192,7 +177,6 @@ void WebHistoryItem::setIsTargetItem(bool isTargetItem)
int WebHistoryItem::visitCount() const
{
- ASSERT(!isNull());
return m_private->visitCount();
}
@@ -204,7 +188,6 @@ void WebHistoryItem::setVisitCount(int count)
WebVector<WebString> WebHistoryItem::documentState() const
{
- ASSERT(!isNull());
return m_private->documentState();
}
@@ -218,9 +201,19 @@ void WebHistoryItem::setDocumentState(const WebVector<WebString>& state)
m_private->setDocumentState(ds);
}
+long long WebHistoryItem::itemSequenceNumber() const
+{
+ return m_private->itemSequenceNumber();
+}
+
+void WebHistoryItem::setItemSequenceNumber(long long itemSequenceNumber)
+{
+ ensureMutable();
+ m_private->setItemSequenceNumber(itemSequenceNumber);
+}
+
long long WebHistoryItem::documentSequenceNumber() const
{
- ASSERT(!isNull());
return m_private->documentSequenceNumber();
}
@@ -230,9 +223,19 @@ void WebHistoryItem::setDocumentSequenceNumber(long long documentSequenceNumber)
m_private->setDocumentSequenceNumber(documentSequenceNumber);
}
+WebSerializedScriptValue WebHistoryItem::stateObject() const
+{
+ return WebSerializedScriptValue(m_private->stateObject());
+}
+
+void WebHistoryItem::setStateObject(const WebSerializedScriptValue& object)
+{
+ ensureMutable();
+ m_private->setStateObject(object);
+}
+
WebString WebHistoryItem::httpContentType() const
{
- ASSERT(!isNull());
return m_private->formContentType();
}
@@ -244,7 +247,6 @@ void WebHistoryItem::setHTTPContentType(const WebString& httpContentType)
WebHTTPBody WebHistoryItem::httpBody() const
{
- ASSERT(!isNull());
return WebHTTPBody(m_private->formData());
}
@@ -256,7 +258,6 @@ void WebHistoryItem::setHTTPBody(const WebHTTPBody& httpBody)
WebVector<WebHistoryItem> WebHistoryItem::children() const
{
- ASSERT(!isNull());
return m_private->children();
}
@@ -275,34 +276,25 @@ void WebHistoryItem::appendToChildren(const WebHistoryItem& item)
}
WebHistoryItem::WebHistoryItem(const PassRefPtr<HistoryItem>& item)
- : m_private(static_cast<WebHistoryItemPrivate*>(item.releaseRef()))
+ : m_private(item)
{
}
WebHistoryItem& WebHistoryItem::operator=(const PassRefPtr<HistoryItem>& item)
{
- assign(static_cast<WebHistoryItemPrivate*>(item.releaseRef()));
+ m_private = item;
return *this;
}
WebHistoryItem::operator PassRefPtr<HistoryItem>() const
{
- return m_private;
-}
-
-void WebHistoryItem::assign(WebHistoryItemPrivate* p)
-{
- // p is already ref'd for us by the caller
- if (m_private)
- m_private->deref();
- m_private = p;
+ return m_private.get();
}
void WebHistoryItem::ensureMutable()
{
- ASSERT(!isNull());
if (!m_private->hasOneRef())
- assign(static_cast<WebHistoryItemPrivate*>(m_private->copy().releaseRef()));
+ m_private = m_private->copy();
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebIDBCallbacksImpl.cpp b/WebKit/chromium/src/WebIDBCallbacksImpl.cpp
new file mode 100644
index 0000000..14ed02e
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBCallbacksImpl.cpp
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBCallbacksImpl.h"
+
+#include "IDBCallbacks.h"
+#include "IDBCursorBackendProxy.h"
+#include "IDBDatabaseError.h"
+#include "IDBDatabaseProxy.h"
+#include "IDBIndexBackendProxy.h"
+#include "IDBKey.h"
+#include "IDBObjectStoreProxy.h"
+#include "IDBTransactionBackendProxy.h"
+#include "WebIDBCallbacks.h"
+#include "WebIDBDatabase.h"
+#include "WebIDBDatabaseError.h"
+#include "WebIDBIndex.h"
+#include "WebIDBKey.h"
+#include "WebIDBObjectStore.h"
+#include "WebIDBTransaction.h"
+#include "WebSerializedScriptValue.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+WebIDBCallbacksImpl::WebIDBCallbacksImpl(PassRefPtr<IDBCallbacks> callbacks)
+ : m_callbacks(callbacks)
+{
+}
+
+WebIDBCallbacksImpl::~WebIDBCallbacksImpl()
+{
+}
+
+void WebIDBCallbacksImpl::onError(const WebKit::WebIDBDatabaseError& error)
+{
+ m_callbacks->onError(error);
+}
+
+void WebIDBCallbacksImpl::onSuccess()
+{
+ m_callbacks->onSuccess();
+}
+
+void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBCursor* cursor)
+{
+ m_callbacks->onSuccess(IDBCursorBackendProxy::create(cursor));
+}
+
+void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBDatabase* webKitInstance)
+{
+ m_callbacks->onSuccess(IDBDatabaseProxy::create(webKitInstance));
+}
+
+void WebIDBCallbacksImpl::onSuccess(const WebKit::WebIDBKey& key)
+{
+ m_callbacks->onSuccess(key);
+}
+
+void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBIndex* webKitInstance)
+{
+ m_callbacks->onSuccess(IDBIndexBackendProxy::create(webKitInstance));
+}
+
+void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBObjectStore* webKitInstance)
+{
+ m_callbacks->onSuccess(IDBObjectStoreProxy::create(webKitInstance));
+}
+
+void WebIDBCallbacksImpl::onSuccess(WebKit::WebIDBTransaction* webKitInstance)
+{
+ m_callbacks->onSuccess(IDBTransactionBackendProxy::create(webKitInstance));
+}
+
+void WebIDBCallbacksImpl::onSuccess(const WebKit::WebSerializedScriptValue& serializedScriptValue)
+{
+ m_callbacks->onSuccess(serializedScriptValue);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBCallbacksImpl.h b/WebKit/chromium/src/WebIDBCallbacksImpl.h
new file mode 100644
index 0000000..33a72f4
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBCallbacksImpl.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef WebIDBCallbacksImpl_h
+#define WebIDBCallbacksImpl_h
+
+#include "WebIDBCallbacks.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+class IDBCallbacks;
+
+class WebIDBCallbacksImpl : public WebKit::WebIDBCallbacks {
+public:
+ WebIDBCallbacksImpl(PassRefPtr<IDBCallbacks>);
+ virtual ~WebIDBCallbacksImpl();
+
+ virtual void onError(const WebKit::WebIDBDatabaseError&);
+ virtual void onSuccess(); // For "null".
+ virtual void onSuccess(WebKit::WebIDBCursor*);
+ virtual void onSuccess(WebKit::WebIDBDatabase*);
+ virtual void onSuccess(const WebKit::WebIDBKey&);
+ virtual void onSuccess(WebKit::WebIDBIndex*);
+ virtual void onSuccess(WebKit::WebIDBObjectStore*);
+ virtual void onSuccess(WebKit::WebIDBTransaction*);
+ virtual void onSuccess(const WebKit::WebSerializedScriptValue&);
+
+private:
+ RefPtr<IDBCallbacks> m_callbacks;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // WebIDBCallbacksImpl_h
diff --git a/WebKit/chromium/src/WebIDBCursorImpl.cpp b/WebKit/chromium/src/WebIDBCursorImpl.cpp
new file mode 100644
index 0000000..eca5d42
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBCursorImpl.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBCursorImpl.h"
+
+#include "IDBAny.h"
+#include "IDBCallbacksProxy.h"
+#include "IDBCursorBackendInterface.h"
+#include "IDBKey.h"
+#include "WebIDBKey.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebIDBCursorImpl::WebIDBCursorImpl(PassRefPtr<IDBCursorBackendInterface> idbCursorBackend)
+ : m_idbCursorBackend(idbCursorBackend)
+{
+}
+
+WebIDBCursorImpl::~WebIDBCursorImpl()
+{
+}
+
+unsigned short WebIDBCursorImpl::direction() const
+{
+ return m_idbCursorBackend->direction();
+}
+
+WebIDBKey WebIDBCursorImpl::key() const
+{
+ return WebIDBKey(m_idbCursorBackend->key());
+}
+
+void WebIDBCursorImpl::value(WebSerializedScriptValue& serializedScriptValue, WebIDBKey& idbKey) const
+{
+ // Verify we're starting off with blank slates.
+ ASSERT(serializedScriptValue.isNull());
+ ASSERT(idbKey.type() == WebIDBKey::InvalidType);
+
+ RefPtr<IDBAny> any = m_idbCursorBackend->value();
+ if (any->type() == IDBAny::SerializedScriptValueType)
+ serializedScriptValue.assign(any->serializedScriptValue());
+ else if (any->type() == IDBAny::IDBKeyType)
+ idbKey.assign(any->idbKey());
+ else
+ ASSERT_NOT_REACHED();
+}
+
+void WebIDBCursorImpl::update(const WebSerializedScriptValue& value, WebIDBCallbacks* callbacks, WebExceptionCode& ec)
+{
+ m_idbCursorBackend->update(value, IDBCallbacksProxy::create(callbacks), ec);
+}
+
+void WebIDBCursorImpl::continueFunction(const WebIDBKey& key, WebIDBCallbacks* callbacks, WebExceptionCode& ec)
+{
+ m_idbCursorBackend->continueFunction(key, IDBCallbacksProxy::create(callbacks), ec);
+}
+
+void WebIDBCursorImpl::remove(WebIDBCallbacks* callbacks, WebExceptionCode& ec)
+{
+ m_idbCursorBackend->remove(IDBCallbacksProxy::create(callbacks), ec);
+}
+
+} // namespace WebCore
diff --git a/WebKit/chromium/src/WebIDBCursorImpl.h b/WebKit/chromium/src/WebIDBCursorImpl.h
new file mode 100644
index 0000000..39fa44b
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBCursorImpl.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef WebIDBCursorImpl_h
+#define WebIDBCursorImpl_h
+
+#include "WebCommon.h"
+#include "WebExceptionCode.h"
+#include "WebIDBCursor.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore { class IDBCursorBackendInterface; }
+
+namespace WebKit {
+
+// See comment in WebIndexedObjectStore for a high level overview these classes.
+class WebIDBCursorImpl : public WebIDBCursor {
+public:
+ WebIDBCursorImpl(WTF::PassRefPtr<WebCore::IDBCursorBackendInterface>);
+ virtual ~WebIDBCursorImpl();
+
+ virtual unsigned short direction() const;
+ virtual WebIDBKey key() const;
+ virtual void value(WebSerializedScriptValue&, WebIDBKey&) const;
+ virtual void update(const WebSerializedScriptValue&, WebIDBCallbacks*, WebExceptionCode&);
+ virtual void continueFunction(const WebIDBKey&, WebIDBCallbacks*, WebExceptionCode&);
+ virtual void remove(WebIDBCallbacks*, WebExceptionCode&);
+
+ private:
+ WTF::RefPtr<WebCore::IDBCursorBackendInterface> m_idbCursorBackend;
+};
+
+} // namespace WebKit
+
+#endif // WebIDBCursorImpl_h
diff --git a/WebKit/chromium/src/WebIDBDatabaseError.cpp b/WebKit/chromium/src/WebIDBDatabaseError.cpp
new file mode 100644
index 0000000..cbbe14a
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBDatabaseError.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebIDBDatabaseError.h"
+
+#include "IDBDatabaseError.h"
+#include "WebString.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebIDBDatabaseError::assign(const WebIDBDatabaseError& value)
+{
+ m_private = value.m_private;
+}
+
+void WebIDBDatabaseError::assign(unsigned short code, const WebString& message)
+{
+ m_private = IDBDatabaseError::create(code, message);
+}
+
+void WebIDBDatabaseError::reset()
+{
+ m_private.reset();
+}
+
+unsigned short WebIDBDatabaseError::code() const
+{
+ return m_private->code();
+}
+
+WebString WebIDBDatabaseError::message() const
+{
+ return m_private->message();
+}
+
+WebIDBDatabaseError::WebIDBDatabaseError(const PassRefPtr<IDBDatabaseError>& value)
+ : m_private(value)
+{
+}
+
+WebIDBDatabaseError& WebIDBDatabaseError::operator=(const PassRefPtr<IDBDatabaseError>& value)
+{
+ m_private = value;
+ return *this;
+}
+
+WebIDBDatabaseError::operator PassRefPtr<IDBDatabaseError>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBDatabaseImpl.cpp b/WebKit/chromium/src/WebIDBDatabaseImpl.cpp
new file mode 100644
index 0000000..fa7a200
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBDatabaseImpl.cpp
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBDatabaseImpl.h"
+
+#include "DOMStringList.h"
+#include "IDBCallbacksProxy.h"
+#include "IDBDatabaseBackendInterface.h"
+#include "IDBTransactionBackendInterface.h"
+#include "WebIDBCallbacks.h"
+#include "WebIDBObjectStoreImpl.h"
+#include "WebIDBTransactionImpl.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebIDBDatabaseImpl::WebIDBDatabaseImpl(PassRefPtr<IDBDatabaseBackendInterface> databaseBackend)
+ : m_databaseBackend(databaseBackend)
+{
+}
+
+WebIDBDatabaseImpl::~WebIDBDatabaseImpl()
+{
+}
+
+WebString WebIDBDatabaseImpl::name() const
+{
+ return m_databaseBackend->name();
+}
+
+WebString WebIDBDatabaseImpl::version() const
+{
+ return m_databaseBackend->version();
+}
+
+WebDOMStringList WebIDBDatabaseImpl::objectStoreNames() const
+{
+ return m_databaseBackend->objectStoreNames();
+}
+
+WebIDBObjectStore* WebIDBDatabaseImpl::createObjectStore(const WebString& name, const WebString& keyPath, bool autoIncrement, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ RefPtr<IDBObjectStoreBackendInterface> objectStore = m_databaseBackend->createObjectStore(name, keyPath, autoIncrement, transaction.getIDBTransactionBackendInterface(), ec);
+ if (!objectStore) {
+ ASSERT(ec);
+ return 0;
+ }
+ return new WebIDBObjectStoreImpl(objectStore);
+}
+
+void WebIDBDatabaseImpl::deleteObjectStore(const WebString& name, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_databaseBackend->deleteObjectStore(name, transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+void WebIDBDatabaseImpl::setVersion(const WebString& version, WebIDBCallbacks* callbacks, WebExceptionCode& ec)
+{
+ m_databaseBackend->setVersion(version, IDBCallbacksProxy::create(callbacks), ec);
+}
+
+WebIDBTransaction* WebIDBDatabaseImpl::transaction(const WebDOMStringList& names, unsigned short mode, unsigned long timeout, WebExceptionCode& ec)
+{
+ RefPtr<DOMStringList> nameList = PassRefPtr<DOMStringList>(names);
+ RefPtr<IDBTransactionBackendInterface> transaction = m_databaseBackend->transaction(nameList.get(), mode, timeout, ec);
+ if (!transaction) {
+ ASSERT(ec);
+ return 0;
+ }
+ return new WebIDBTransactionImpl(transaction);
+}
+
+void WebIDBDatabaseImpl::close()
+{
+ m_databaseBackend->close();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBDatabaseImpl.h b/WebKit/chromium/src/WebIDBDatabaseImpl.h
new file mode 100644
index 0000000..64e0b2e
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBDatabaseImpl.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef WebIDBDatabaseImpl_h
+#define WebIDBDatabaseImpl_h
+
+#include "WebCommon.h"
+#include "WebExceptionCode.h"
+#include "WebIDBDatabase.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore { class IDBDatabaseBackendInterface; }
+
+namespace WebKit {
+
+class WebIDBObjectStore;
+class WebIDBTransaction;
+
+// See comment in WebIDBFactory for a high level overview these classes.
+class WebIDBDatabaseImpl : public WebIDBDatabase {
+public:
+ WebIDBDatabaseImpl(WTF::PassRefPtr<WebCore::IDBDatabaseBackendInterface>);
+ virtual ~WebIDBDatabaseImpl();
+
+ virtual WebString name() const;
+ virtual WebString version() const;
+ virtual WebDOMStringList objectStoreNames() const;
+
+ virtual WebIDBObjectStore* createObjectStore(const WebString& name, const WebString& keyPath, bool autoIncrement, const WebIDBTransaction&, WebExceptionCode&);
+ virtual void deleteObjectStore(const WebString& name, const WebIDBTransaction&, WebExceptionCode&);
+ virtual void setVersion(const WebString& version, WebIDBCallbacks* callbacks, WebExceptionCode&);
+ virtual WebIDBTransaction* transaction(const WebDOMStringList& names, unsigned short mode, unsigned long timeout, WebExceptionCode&);
+ virtual void close();
+
+private:
+ WTF::RefPtr<WebCore::IDBDatabaseBackendInterface> m_databaseBackend;
+};
+
+} // namespace WebKit
+
+#endif // WebIDBDatabaseImpl_h
diff --git a/WebKit/chromium/src/WebIDBFactoryImpl.cpp b/WebKit/chromium/src/WebIDBFactoryImpl.cpp
new file mode 100755
index 0000000..a509076
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBFactoryImpl.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebIDBFactoryImpl.h"
+
+#include "DOMStringList.h"
+#include "IDBCallbacksProxy.h"
+#include "IDBFactoryBackendImpl.h"
+#include "SecurityOrigin.h"
+#include "WebIDBDatabaseError.h"
+#include <wtf/OwnPtr.h>
+
+#if ENABLE(INDEXED_DATABASE)
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebIDBFactory* WebIDBFactory::create()
+{
+ return new WebIDBFactoryImpl();
+}
+
+WebIDBFactoryImpl::WebIDBFactoryImpl()
+ : m_idbFactoryBackend(WebCore::IDBFactoryBackendImpl::create())
+{
+}
+
+WebIDBFactoryImpl::~WebIDBFactoryImpl()
+{
+}
+
+void WebIDBFactoryImpl::open(const WebString& name, WebIDBCallbacks* callbacks, const WebSecurityOrigin& origin, WebFrame*, const WebString& dataDir, unsigned long long maximumSize)
+{
+ m_idbFactoryBackend->open(name, IDBCallbacksProxy::create(callbacks), origin, 0, dataDir, maximumSize);
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBFactoryImpl.h b/WebKit/chromium/src/WebIDBFactoryImpl.h
new file mode 100755
index 0000000..9ed6e3f
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBFactoryImpl.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2010 Google 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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.
+ */
+
+#ifndef WebIDBFactoryImpl_h
+#define WebIDBFactoryImpl_h
+
+#include "WebDOMStringList.h"
+#include "WebIDBFactory.h"
+#include <wtf/RefPtr.h>
+
+namespace WebCore { class IDBFactoryBackendInterface; }
+
+namespace WebKit {
+
+class WebIDBFactoryImpl : public WebIDBFactory {
+public:
+ WebIDBFactoryImpl();
+ virtual ~WebIDBFactoryImpl();
+
+ virtual void open(const WebString& name, WebIDBCallbacks*, const WebSecurityOrigin&, WebFrame*, const WebString& dataDir, unsigned long long maximumSize);
+
+private:
+ WTF::RefPtr<WebCore::IDBFactoryBackendInterface> m_idbFactoryBackend;
+};
+
+} // namespace WebKit
+
+#endif // WebIDBFactoryImpl_h
diff --git a/WebKit/chromium/src/WebIDBIndexImpl.cpp b/WebKit/chromium/src/WebIDBIndexImpl.cpp
new file mode 100644
index 0000000..6e8e1f2
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBIndexImpl.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBIndexImpl.h"
+
+#include "IDBCallbacksProxy.h"
+#include "IDBIndex.h"
+#include "IDBKeyRange.h"
+#include "WebIDBCallbacks.h"
+#include "WebIDBKey.h"
+#include "WebIDBKeyRange.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebIDBIndexImpl::WebIDBIndexImpl(PassRefPtr<IDBIndexBackendInterface> backend)
+ : m_backend(backend)
+{
+}
+
+WebIDBIndexImpl::~WebIDBIndexImpl()
+{
+}
+
+WebString WebIDBIndexImpl::name() const
+{
+ return m_backend->name();
+}
+
+WebString WebIDBIndexImpl::storeName() const
+{
+ return m_backend->storeName();
+}
+
+WebString WebIDBIndexImpl::keyPath() const
+{
+ return m_backend->keyPath();
+}
+
+bool WebIDBIndexImpl::unique() const
+{
+ return m_backend->unique();
+}
+
+void WebIDBIndexImpl::openObjectCursor(const WebIDBKeyRange& keyRange, unsigned short direction, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_backend->openCursor(keyRange, direction, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+void WebIDBIndexImpl::openKeyCursor(const WebIDBKeyRange& keyRange, unsigned short direction, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_backend->openKeyCursor(keyRange, direction, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+void WebIDBIndexImpl::getObject(const WebIDBKey& keyRange, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_backend->get(keyRange, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+void WebIDBIndexImpl::getKey(const WebIDBKey& keyRange, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_backend->getKey(keyRange, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBIndexImpl.h b/WebKit/chromium/src/WebIDBIndexImpl.h
new file mode 100644
index 0000000..f68da7f
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBIndexImpl.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef WebIDBIndexImpl_h
+#define WebIDBIndexImpl_h
+
+#include "WebCommon.h"
+#include "WebIDBIndex.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore { class IDBIndexBackendInterface; }
+
+namespace WebKit {
+
+// See comment in WebIndexedDatabase for a high level overview these classes.
+class WebIDBIndexImpl : public WebIDBIndex {
+public:
+ WebIDBIndexImpl(WTF::PassRefPtr<WebCore::IDBIndexBackendInterface>);
+ virtual ~WebIDBIndexImpl();
+
+ virtual WebString name() const;
+ virtual WebString storeName() const;
+ virtual WebString keyPath() const;
+ virtual bool unique() const;
+
+ virtual void openObjectCursor(const WebIDBKeyRange&, unsigned short direction, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&);
+ virtual void openKeyCursor(const WebIDBKeyRange&, unsigned short direction, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&);
+ virtual void getObject(const WebIDBKey&, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&);
+ virtual void getKey(const WebIDBKey&, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&);
+
+private:
+ WTF::RefPtr<WebCore::IDBIndexBackendInterface> m_backend;
+};
+
+} // namespace WebKit
+
+#endif // WebIDBIndexImpl_h
diff --git a/WebKit/chromium/src/WebIDBKey.cpp b/WebKit/chromium/src/WebIDBKey.cpp
new file mode 100644
index 0000000..b7a7db8
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBKey.cpp
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebIDBKey.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBBindingUtilities.h"
+#include "IDBKey.h"
+#include "IDBKeyPath.h"
+#include "SerializedScriptValue.h"
+#include "WebIDBKeyPath.h"
+#include "WebSerializedScriptValue.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebIDBKey WebIDBKey::createNull()
+{
+ WebIDBKey key;
+ key.assignNull();
+ return key;
+}
+
+WebIDBKey WebIDBKey::createInvalid()
+{
+ WebIDBKey key;
+ key.assignInvalid();
+ return key;
+}
+
+WebIDBKey WebIDBKey::createFromValueAndKeyPath(const WebSerializedScriptValue& serializedScriptValue, const WebIDBKeyPath& idbKeyPath)
+{
+ if (serializedScriptValue.isNull())
+ return WebIDBKey::createInvalid();
+ return WebCore::createIDBKeyFromSerializedValueAndKeyPath(serializedScriptValue, idbKeyPath);
+}
+
+void WebIDBKey::assign(const WebIDBKey& value)
+{
+ m_private = value.m_private;
+}
+
+void WebIDBKey::assignNull()
+{
+ m_private = IDBKey::create();
+}
+
+void WebIDBKey::assign(const WebString& string)
+{
+ m_private = IDBKey::create(string);
+}
+
+void WebIDBKey::assign(double number)
+{
+ m_private = IDBKey::create(number);
+}
+
+void WebIDBKey::assignInvalid()
+{
+ m_private = 0;
+}
+
+void WebIDBKey::reset()
+{
+ m_private.reset();
+}
+
+WebIDBKey::Type WebIDBKey::type() const
+{
+ if (!m_private.get())
+ return InvalidType;
+ return Type(m_private->type());
+}
+
+WebString WebIDBKey::string() const
+{
+ return m_private->string();
+}
+
+double WebIDBKey::number() const
+{
+ return m_private->number();
+}
+
+WebIDBKey::WebIDBKey(const PassRefPtr<IDBKey>& value)
+ : m_private(value)
+{
+}
+
+WebIDBKey& WebIDBKey::operator=(const PassRefPtr<IDBKey>& value)
+{
+ m_private = value;
+ return *this;
+}
+
+WebIDBKey::operator PassRefPtr<IDBKey>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBKeyPath.cpp b/WebKit/chromium/src/WebIDBKeyPath.cpp
new file mode 100644
index 0000000..9eb33d6
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBKeyPath.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBKeyPath.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBKeyPath.h"
+#include "WebString.h"
+#include "WebVector.h"
+#include <wtf/Vector.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebIDBKeyPath WebIDBKeyPath::create(const WebString& keyPath)
+{
+ WTF::Vector<IDBKeyPathElement> idbElements;
+ IDBKeyPathParseError idbError;
+ IDBParseKeyPath(keyPath, idbElements, idbError);
+ return WebIDBKeyPath(idbElements, static_cast<int>(idbError));
+}
+
+WebIDBKeyPath::WebIDBKeyPath(const WTF::Vector<IDBKeyPathElement>& elements, int parseError)
+ : m_private(new WTF::Vector<IDBKeyPathElement>(elements))
+ , m_parseError(parseError)
+{
+}
+
+int WebIDBKeyPath::parseError() const
+{
+ return m_parseError;
+}
+
+void WebIDBKeyPath::assign(const WebIDBKeyPath& keyPath)
+{
+ m_parseError = keyPath.m_parseError;
+ m_private.reset(new WTF::Vector<IDBKeyPathElement>(keyPath));
+}
+
+void WebIDBKeyPath::reset()
+{
+ m_private.reset(0);
+}
+
+WebIDBKeyPath::operator const WTF::Vector<WebCore::IDBKeyPathElement, 0>&() const
+{
+ return *m_private.get();
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBKeyRange.cpp b/WebKit/chromium/src/WebIDBKeyRange.cpp
new file mode 100644
index 0000000..ec5b7c2
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBKeyRange.cpp
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBKeyRange.h"
+
+#include "IDBKey.h"
+#include "IDBKeyRange.h"
+#include "WebIDBKey.h"
+
+using WebCore::IDBKeyRange;
+
+namespace WebKit {
+
+void WebIDBKeyRange::assign(const WebIDBKeyRange& other)
+{
+ m_private = other.m_private;
+}
+
+void WebIDBKeyRange::assign(const WebIDBKey& lower, const WebIDBKey& upper, bool lowerOpen, bool upperOpen)
+{
+ if (lower.type() == WebIDBKey::InvalidType && upper.type() == WebIDBKey::InvalidType)
+ m_private = 0;
+ else
+ m_private = IDBKeyRange::create(lower, upper, lowerOpen, upperOpen);
+}
+
+// FIXME: Remove this after next roll.
+void WebIDBKeyRange::assign(const WebIDBKey& lower, const WebIDBKey& upper, unsigned short flags)
+{
+ bool lowerOpen = !!(flags & 1);
+ bool upperOpen = !!(flags & 2);
+
+ if (lower.type() == WebIDBKey::InvalidType && upper.type() == WebIDBKey::InvalidType)
+ m_private = 0;
+ else
+ m_private = IDBKeyRange::create(lower, upper, lowerOpen, upperOpen);
+}
+
+void WebIDBKeyRange::reset()
+{
+ m_private.reset();
+}
+
+WebIDBKey WebIDBKeyRange::left() const
+{
+ return lower();
+}
+
+WebIDBKey WebIDBKeyRange::right() const
+{
+ return upper();
+}
+
+WebIDBKey WebIDBKeyRange::lower() const
+{
+ if (!m_private.get())
+ return WebIDBKey::createInvalid();
+ return m_private->lower();
+}
+
+WebIDBKey WebIDBKeyRange::upper() const
+{
+ if (!m_private.get())
+ return WebIDBKey::createInvalid();
+ return m_private->upper();
+}
+
+bool WebIDBKeyRange::lowerOpen() const
+{
+ return m_private.get() && m_private->lowerOpen();
+}
+
+bool WebIDBKeyRange::upperOpen() const
+{
+ return m_private.get() && m_private->upperOpen();
+}
+
+// FIXME: Remove this after next roll.
+unsigned short WebIDBKeyRange::flags() const
+{
+ if (!m_private.get())
+ return 0;
+
+ unsigned short flags = 0;
+ if (m_private->lowerOpen())
+ flags |= 1;
+ if (m_private->upperOpen())
+ flags |= 2;
+ return flags;
+}
+
+WebIDBKeyRange::WebIDBKeyRange(const PassRefPtr<IDBKeyRange>& value)
+ : m_private(value)
+{
+}
+
+WebIDBKeyRange& WebIDBKeyRange::operator=(const PassRefPtr<IDBKeyRange>& value)
+{
+ m_private = value;
+ return *this;
+}
+
+WebIDBKeyRange::operator PassRefPtr<IDBKeyRange>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp b/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp
new file mode 100755
index 0000000..0503ede
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBObjectStoreImpl.h"
+
+#include "DOMStringList.h"
+#include "IDBCallbacksProxy.h"
+#include "IDBKeyRange.h"
+#include "IDBObjectStoreBackendInterface.h"
+#include "WebIDBIndexImpl.h"
+#include "WebIDBKey.h"
+#include "WebIDBKeyRange.h"
+#include "WebIDBTransaction.h"
+#include "WebSerializedScriptValue.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebIDBObjectStoreImpl::WebIDBObjectStoreImpl(PassRefPtr<IDBObjectStoreBackendInterface> objectStore)
+ : m_objectStore(objectStore)
+{
+}
+
+WebIDBObjectStoreImpl::~WebIDBObjectStoreImpl()
+{
+}
+
+WebString WebIDBObjectStoreImpl::name() const
+{
+ return m_objectStore->name();
+}
+
+WebString WebIDBObjectStoreImpl::keyPath() const
+{
+ return m_objectStore->keyPath();
+}
+
+WebDOMStringList WebIDBObjectStoreImpl::indexNames() const
+{
+ return m_objectStore->indexNames();
+}
+
+void WebIDBObjectStoreImpl::get(const WebIDBKey& key, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_objectStore->get(key, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+void WebIDBObjectStoreImpl::put(const WebSerializedScriptValue& value, const WebIDBKey& key, bool addOnly, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_objectStore->put(value, key, addOnly, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+void WebIDBObjectStoreImpl::deleteFunction(const WebIDBKey& key, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_objectStore->deleteFunction(key, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+WebIDBIndex* WebIDBObjectStoreImpl::createIndex(const WebString& name, const WebString& keyPath, bool unique, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ RefPtr<IDBIndexBackendInterface> index = m_objectStore->createIndex(name, keyPath, unique, transaction.getIDBTransactionBackendInterface(), ec);
+ if (!index)
+ return 0;
+ return new WebIDBIndexImpl(index);
+}
+
+WebIDBIndex* WebIDBObjectStoreImpl::index(const WebString& name, WebExceptionCode& ec)
+{
+ RefPtr<IDBIndexBackendInterface> index = m_objectStore->index(name, ec);
+ if (!index)
+ return 0;
+ return new WebIDBIndexImpl(index);
+}
+
+void WebIDBObjectStoreImpl::deleteIndex(const WebString& name, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_objectStore->deleteIndex(name, transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+void WebIDBObjectStoreImpl::openCursor(const WebIDBKeyRange& keyRange, unsigned short direction, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction, WebExceptionCode& ec)
+{
+ m_objectStore->openCursor(keyRange, direction, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface(), ec);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBObjectStoreImpl.h b/WebKit/chromium/src/WebIDBObjectStoreImpl.h
new file mode 100755
index 0000000..f9cd776
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBObjectStoreImpl.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef WebIDBObjectStoreImpl_h
+#define WebIDBObjectStoreImpl_h
+
+#include "WebCommon.h"
+#include "WebIDBObjectStore.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore { class IDBObjectStoreBackendInterface; }
+
+namespace WebKit {
+
+class WebIDBIndex;
+
+// See comment in WebIndexedObjectStore for a high level overview these classes.
+class WebIDBObjectStoreImpl : public WebIDBObjectStore {
+public:
+ WebIDBObjectStoreImpl(WTF::PassRefPtr<WebCore::IDBObjectStoreBackendInterface>);
+ ~WebIDBObjectStoreImpl();
+
+ WebString name() const;
+ WebString keyPath() const;
+ WebDOMStringList indexNames() const;
+
+ void get(const WebIDBKey& key, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&);
+ void put(const WebSerializedScriptValue&, const WebIDBKey& key, bool addOnly, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&);
+ void deleteFunction(const WebIDBKey& key, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&);
+
+ WebIDBIndex* createIndex(const WebString& name, const WebString& keyPath, bool unique, const WebIDBTransaction&, WebExceptionCode&);
+ WebIDBIndex* index(const WebString& name, WebExceptionCode&);
+ void deleteIndex(const WebString& name, const WebIDBTransaction&, WebExceptionCode&);
+
+ void openCursor(const WebIDBKeyRange&, unsigned short direction, WebIDBCallbacks*, const WebIDBTransaction&, WebExceptionCode&);
+
+ private:
+ WTF::RefPtr<WebCore::IDBObjectStoreBackendInterface> m_objectStore;
+};
+
+} // namespace WebKit
+
+#endif // WebIDBObjectStoreImpl_h
diff --git a/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.cpp b/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.cpp
new file mode 100644
index 0000000..96924cf
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBTransactionCallbacksImpl.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBTransactionCallbacks.h"
+
+namespace WebCore {
+
+WebIDBTransactionCallbacksImpl::WebIDBTransactionCallbacksImpl(PassRefPtr<IDBTransactionCallbacks> callbacks)
+ : m_callbacks(callbacks)
+{
+}
+
+WebIDBTransactionCallbacksImpl::~WebIDBTransactionCallbacksImpl()
+{
+}
+
+void WebIDBTransactionCallbacksImpl::onAbort()
+{
+ m_callbacks->onAbort();
+}
+
+void WebIDBTransactionCallbacksImpl::onComplete()
+{
+ m_callbacks->onComplete();
+}
+
+void WebIDBTransactionCallbacksImpl::onTimeout()
+{
+ m_callbacks->onTimeout();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.h b/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.h
new file mode 100644
index 0000000..89b9cbe
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBTransactionCallbacksImpl.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef WebIDBTransactionCallbacksImpl_h
+#define WebIDBTransactionCallbacksImpl_h
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "WebIDBTransactionCallbacks.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class IDBTransactionCallbacks;
+
+class WebIDBTransactionCallbacksImpl : public WebKit::WebIDBTransactionCallbacks {
+public:
+ WebIDBTransactionCallbacksImpl(PassRefPtr<IDBTransactionCallbacks>);
+ virtual ~WebIDBTransactionCallbacksImpl();
+
+ virtual void onAbort();
+ virtual void onComplete();
+ virtual void onTimeout();
+
+private:
+ RefPtr<IDBTransactionCallbacks> m_callbacks;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // WebIDBTransactionCallbacksImpl_h
diff --git a/WebKit/chromium/src/WebIDBTransactionImpl.cpp b/WebKit/chromium/src/WebIDBTransactionImpl.cpp
new file mode 100644
index 0000000..1ed6f4b
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBTransactionImpl.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebIDBTransactionImpl.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBTransaction.h"
+#include "IDBTransactionCallbacksProxy.h"
+#include "WebIDBObjectStoreImpl.h"
+#include "WebIDBTransactionCallbacks.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebIDBTransactionImpl::WebIDBTransactionImpl(PassRefPtr<IDBTransactionBackendInterface> backend)
+ : m_backend(backend)
+{
+}
+
+WebIDBTransactionImpl::~WebIDBTransactionImpl()
+{
+}
+
+int WebIDBTransactionImpl::mode() const
+{
+ return m_backend->mode();
+}
+
+WebIDBObjectStore* WebIDBTransactionImpl::objectStore(const WebString& name, ExceptionCode& ec)
+{
+ RefPtr<IDBObjectStoreBackendInterface> objectStore = m_backend->objectStore(name, ec);
+ if (!objectStore)
+ return 0;
+ return new WebIDBObjectStoreImpl(objectStore);
+}
+
+void WebIDBTransactionImpl::abort()
+{
+ m_backend->abort();
+}
+
+void WebIDBTransactionImpl::didCompleteTaskEvents()
+{
+ m_backend->didCompleteTaskEvents();
+}
+
+void WebIDBTransactionImpl::setCallbacks(WebIDBTransactionCallbacks* callbacks)
+{
+ RefPtr<IDBTransactionCallbacks> idbCallbacks = IDBTransactionCallbacksProxy::create(callbacks);
+ m_backend->setCallbacks(idbCallbacks.get());
+}
+
+IDBTransactionBackendInterface* WebIDBTransactionImpl::getIDBTransactionBackendInterface() const
+{
+ return m_backend.get();
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBTransactionImpl.h b/WebKit/chromium/src/WebIDBTransactionImpl.h
new file mode 100644
index 0000000..d26fc37
--- /dev/null
+++ b/WebKit/chromium/src/WebIDBTransactionImpl.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#ifndef WebIDBTransactionImpl_h
+#define WebIDBTransactionImpl_h
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "WebCommon.h"
+#include "WebIDBTransaction.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebKit {
+
+// See comment in WebIndexedDatabase for a high level overview these classes.
+class WebIDBTransactionImpl: public WebIDBTransaction {
+public:
+ WebIDBTransactionImpl(WTF::PassRefPtr<WebCore::IDBTransactionBackendInterface>);
+ virtual ~WebIDBTransactionImpl();
+
+ virtual int mode() const;
+ virtual WebIDBObjectStore* objectStore(const WebString& name, WebExceptionCode&);
+ virtual void abort();
+ virtual void didCompleteTaskEvents();
+ virtual void setCallbacks(WebIDBTransactionCallbacks*);
+
+ virtual WebCore::IDBTransactionBackendInterface* getIDBTransactionBackendInterface() const;
+
+private:
+ WTF::RefPtr<WebCore::IDBTransactionBackendInterface> m_backend;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(INDEXED_DATABASE)
+
+#endif // WebIDBTransactionImpl_h
diff --git a/WebKit/chromium/src/WebImageCG.cpp b/WebKit/chromium/src/WebImageCG.cpp
index 60b2449..045c8be 100644
--- a/WebKit/chromium/src/WebImageCG.cpp
+++ b/WebKit/chromium/src/WebImageCG.cpp
@@ -89,14 +89,16 @@ WebSize WebImage::size() const
WebImage::WebImage(const PassRefPtr<Image>& image)
: m_imageRef(0)
{
- if (image.get())
- assign(image->nativeImageForCurrentFrame());
+ NativeImagePtr p;
+ if (image.get() && (p = image->nativeImageForCurrentFrame()))
+ assign(p);
}
WebImage& WebImage::operator=(const PassRefPtr<Image>& image)
{
- if (image.get())
- assign(image->nativeImageForCurrentFrame());
+ NativeImagePtr p;
+ if (image.get() && (p = image->nativeImageForCurrentFrame()))
+ assign(p);
else
reset();
return *this;
diff --git a/WebKit/chromium/src/WebImageDecoder.cpp b/WebKit/chromium/src/WebImageDecoder.cpp
new file mode 100644
index 0000000..0cfd458
--- /dev/null
+++ b/WebKit/chromium/src/WebImageDecoder.cpp
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebImageDecoder.h"
+
+#include "BMPImageDecoder.h"
+#include "ICOImageDecoder.h"
+#include "SharedBuffer.h"
+#include "WebData.h"
+#include "WebImage.h"
+#include "WebSize.h"
+
+#if WEBKIT_USING_SKIA
+#include <wtf/OwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#endif
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebImageDecoder::reset()
+{
+ delete m_private;
+}
+
+void WebImageDecoder::init(Type type)
+{
+ switch (type) {
+ case TypeBMP:
+ m_private = new BMPImageDecoder(true, false);
+ break;
+ case TypeICO:
+ m_private = new ICOImageDecoder(true, false);
+ break;
+ }
+}
+
+void WebImageDecoder::setData(const WebData& data, bool allDataReceived)
+{
+ ASSERT(m_private);
+ m_private->setData(PassRefPtr<SharedBuffer>(data).get(), allDataReceived);
+}
+
+bool WebImageDecoder::isFailed() const
+{
+ ASSERT(m_private);
+ return m_private->failed();
+}
+
+bool WebImageDecoder::isSizeAvailable() const
+{
+ ASSERT(m_private);
+ return m_private->isSizeAvailable();
+}
+
+WebSize WebImageDecoder::size() const
+{
+ ASSERT(m_private);
+ return m_private->size();
+}
+
+size_t WebImageDecoder::frameCount() const
+{
+ ASSERT(m_private);
+ return m_private->frameCount();
+}
+
+bool WebImageDecoder::isFrameCompleteAtIndex(int index) const
+{
+ ASSERT(m_private);
+ RGBA32Buffer* const frameBuffer = m_private->frameBufferAtIndex(index);
+ if (!frameBuffer)
+ return false;
+ return (frameBuffer->status() == RGBA32Buffer::FrameComplete);
+}
+
+WebImage WebImageDecoder::getFrameAtIndex(int index = 0) const
+{
+ ASSERT(m_private);
+ RGBA32Buffer* const frameBuffer = m_private->frameBufferAtIndex(index);
+ if (!frameBuffer)
+ return WebImage();
+#if WEBKIT_USING_SKIA
+ OwnPtr<NativeImageSkia>image(frameBuffer->asNewNativeImage());
+ return WebImage(*image);
+#elif WEBKIT_USING_CG
+ // FIXME: Implement CG side of this.
+ return WebImage(frameBuffer->asNewNativeImage());
+#endif
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebInputElement.cpp b/WebKit/chromium/src/WebInputElement.cpp
index 9fd317f..8d89c60 100644
--- a/WebKit/chromium/src/WebInputElement.cpp
+++ b/WebKit/chromium/src/WebInputElement.cpp
@@ -40,20 +40,24 @@ using namespace WebCore;
namespace WebKit {
-WebInputElement::WebInputElement(const WTF::PassRefPtr<HTMLInputElement>& elem)
- : WebElement(elem.releaseRef())
+bool WebInputElement::isTextField() const
{
+ return constUnwrap<HTMLInputElement>()->isTextField();
}
-WebInputElement& WebInputElement::operator=(const WTF::PassRefPtr<HTMLInputElement>& elem)
+bool WebInputElement::isText() const
{
- WebNode::assign(elem.releaseRef());
- return *this;
+ return constUnwrap<HTMLInputElement>()->isText();
+}
+
+bool WebInputElement::isPasswordField() const
+{
+ return constUnwrap<HTMLInputElement>()->isPasswordField();
}
-WebInputElement::operator WTF::PassRefPtr<HTMLInputElement>() const
+bool WebInputElement::isImageButton() const
{
- return PassRefPtr<HTMLInputElement>(static_cast<HTMLInputElement*>(m_private));
+ return constUnwrap<HTMLInputElement>()->isImageButton();
}
bool WebInputElement::autoComplete() const
@@ -61,19 +65,19 @@ bool WebInputElement::autoComplete() const
return constUnwrap<HTMLInputElement>()->autoComplete();
}
-bool WebInputElement::isEnabledFormControl() const
+bool WebInputElement::isReadOnly() const
{
- return constUnwrap<HTMLInputElement>()->isEnabledFormControl();
+ return constUnwrap<HTMLInputElement>()->readOnly();
}
-WebInputElement::InputType WebInputElement::inputType() const
+bool WebInputElement::isEnabledFormControl() const
{
- return static_cast<InputType>(constUnwrap<HTMLInputElement>()->inputType());
+ return constUnwrap<HTMLInputElement>()->isEnabledFormControl();
}
-WebString WebInputElement::formControlType() const
+int WebInputElement::maxLength() const
{
- return constUnwrap<HTMLInputElement>()->formControlType();
+ return constUnwrap<HTMLInputElement>()->maxLength();
}
bool WebInputElement::isActivatedSubmit() const
@@ -86,9 +90,14 @@ void WebInputElement::setActivatedSubmit(bool activated)
unwrap<HTMLInputElement>()->setActivatedSubmit(activated);
}
-void WebInputElement::setValue(const WebString& value)
+int WebInputElement::size() const
+{
+ return constUnwrap<HTMLInputElement>()->size();
+}
+
+void WebInputElement::setValue(const WebString& value, bool sendChangeEvent)
{
- unwrap<HTMLInputElement>()->setValue(value);
+ unwrap<HTMLInputElement>()->setValue(value, sendChangeEvent);
}
WebString WebInputElement::value() const
@@ -96,6 +105,31 @@ WebString WebInputElement::value() const
return constUnwrap<HTMLInputElement>()->value();
}
+void WebInputElement::setSuggestedValue(const WebString& value)
+{
+ unwrap<HTMLInputElement>()->setSuggestedValue(value);
+}
+
+WebString WebInputElement::suggestedValue() const
+{
+ return constUnwrap<HTMLInputElement>()->suggestedValue();
+}
+
+void WebInputElement::setPlaceholder(const WebString& value)
+{
+ unwrap<HTMLInputElement>()->setPlaceholder(value);
+}
+
+WebString WebInputElement::placeholder() const
+{
+ return constUnwrap<HTMLInputElement>()->placeholder();
+}
+
+bool WebInputElement::isAutofilled() const
+{
+ return constUnwrap<HTMLInputElement>()->isAutofilled();
+}
+
void WebInputElement::setAutofilled(bool autoFilled)
{
unwrap<HTMLInputElement>()->setAutofilled(autoFilled);
@@ -110,23 +144,38 @@ void WebInputElement::setSelectionRange(int start, int end)
{
unwrap<HTMLInputElement>()->setSelectionRange(start, end);
}
-
-WebString WebInputElement::name() const
+
+int WebInputElement::selectionStart() const
{
- return constUnwrap<HTMLInputElement>()->name();
+ return constUnwrap<HTMLInputElement>()->selectionStart();
}
-
-WebString WebInputElement::nameForAutofill() const
+
+int WebInputElement::selectionEnd() const
+{
+ return constUnwrap<HTMLInputElement>()->selectionEnd();
+}
+
+bool WebInputElement::isValidValue(const WebString& value) const
+{
+ return constUnwrap<HTMLInputElement>()->isValidValue(value);
+}
+
+const int WebInputElement::defaultMaxLength = HTMLInputElement::s_maximumLength;
+
+WebInputElement::WebInputElement(const PassRefPtr<HTMLInputElement>& elem)
+ : WebFormControlElement(elem)
+{
+}
+
+WebInputElement& WebInputElement::operator=(const PassRefPtr<HTMLInputElement>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebInputElement::operator PassRefPtr<HTMLInputElement>() const
{
- String name = constUnwrap<HTMLInputElement>()->name();
- String trimmedName = name.stripWhiteSpace();
- if (!trimmedName.isEmpty())
- return trimmedName;
- name = constUnwrap<HTMLInputElement>()->getAttribute(HTMLNames::idAttr);
- trimmedName = name.stripWhiteSpace();
- if (!trimmedName.isEmpty())
- return trimmedName;
- return String();
+ return static_cast<HTMLInputElement*>(m_private.get());
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebInputEvent.cpp b/WebKit/chromium/src/WebInputEvent.cpp
index b5c56fa..c00200e 100644
--- a/WebKit/chromium/src/WebInputEvent.cpp
+++ b/WebKit/chromium/src/WebInputEvent.cpp
@@ -86,6 +86,8 @@ static const char* staticKeyIdentifiers(unsigned short keyCode)
case VKEY_F9:
return "F9";
case VKEY_F10:
+ return "F10";
+ case VKEY_F11:
return "F11";
case VKEY_F12:
return "F12";
diff --git a/WebKit/chromium/src/WebInputEventConversion.cpp b/WebKit/chromium/src/WebInputEventConversion.cpp
index 147f88b..24eb372 100644
--- a/WebKit/chromium/src/WebInputEventConversion.cpp
+++ b/WebKit/chromium/src/WebInputEventConversion.cpp
@@ -40,6 +40,7 @@
#include "PlatformWheelEvent.h"
#include "ScrollView.h"
#include "WebInputEvent.h"
+#include "WheelEvent.h"
#include "Widget.h"
using namespace WebCore;
@@ -103,7 +104,7 @@ PlatformWheelEventBuilder::PlatformWheelEventBuilder(Widget* widget, const WebMo
// MakePlatformKeyboardEvent --------------------------------------------------
-static inline const PlatformKeyboardEvent::Type toPlatformKeyboardEventType(WebInputEvent::Type type)
+static inline PlatformKeyboardEvent::Type toPlatformKeyboardEventType(WebInputEvent::Type type)
{
switch (type) {
case WebInputEvent::KeyUp:
@@ -168,6 +169,64 @@ bool PlatformKeyboardEventBuilder::isCharacterKey() const
return true;
}
+#if ENABLE(TOUCH_EVENTS)
+static inline TouchEventType toPlatformTouchEventType(const WebInputEvent::Type type)
+{
+ switch (type) {
+ case WebInputEvent::TouchStart:
+ return TouchStart;
+ case WebInputEvent::TouchMove:
+ return TouchMove;
+ case WebInputEvent::TouchEnd:
+ return TouchEnd;
+ case WebInputEvent::TouchCancel:
+ return TouchCancel;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+ return TouchStart;
+}
+
+static inline PlatformTouchPoint::State toPlatformTouchPointState(const WebTouchPoint::State state)
+{
+ switch (state) {
+ case WebTouchPoint::StateReleased:
+ return PlatformTouchPoint::TouchReleased;
+ case WebTouchPoint::StatePressed:
+ return PlatformTouchPoint::TouchPressed;
+ case WebTouchPoint::StateMoved:
+ return PlatformTouchPoint::TouchMoved;
+ case WebTouchPoint::StateStationary:
+ return PlatformTouchPoint::TouchStationary;
+ case WebTouchPoint::StateCancelled:
+ return PlatformTouchPoint::TouchCancelled;
+ case WebTouchPoint::StateUndefined:
+ ASSERT_NOT_REACHED();
+ }
+ return PlatformTouchPoint::TouchReleased;
+}
+
+PlatformTouchPointBuilder::PlatformTouchPointBuilder(Widget* widget, const WebTouchPoint& point)
+{
+ m_id = point.id;
+ m_state = toPlatformTouchPointState(point.state);
+ m_pos = widget->convertFromContainingWindow(point.position);
+ m_screenPos = point.screenPosition;
+}
+
+PlatformTouchEventBuilder::PlatformTouchEventBuilder(Widget* widget, const WebTouchEvent& event)
+{
+ m_type = toPlatformTouchEventType(event.type);
+ m_ctrlKey = event.modifiers & WebInputEvent::ControlKey;
+ m_altKey = event.modifiers & WebInputEvent::AltKey;
+ m_shiftKey = event.modifiers & WebInputEvent::ShiftKey;
+ m_metaKey = event.modifiers & WebInputEvent::MetaKey;
+
+ for (int i = 0; i < event.touchPointsLength; ++i)
+ m_touchPoints.append(PlatformTouchPointBuilder(widget, event.touchPoints[i]));
+}
+#endif
+
static int getWebInputModifiers(const UIEventWithKeyState& event)
{
int modifiers = 0;
@@ -182,7 +241,7 @@ static int getWebInputModifiers(const UIEventWithKeyState& event)
return modifiers;
}
-WebMouseEventBuilder::WebMouseEventBuilder(const ScrollView* view, const MouseEvent& event)
+WebMouseEventBuilder::WebMouseEventBuilder(const Widget* widget, const MouseEvent& event)
{
if (event.type() == eventNames().mousemoveEvent)
type = WebInputEvent::MouseMove;
@@ -194,6 +253,8 @@ WebMouseEventBuilder::WebMouseEventBuilder(const ScrollView* view, const MouseEv
type = WebInputEvent::MouseDown;
else if (event.type() == eventNames().mouseupEvent)
type = WebInputEvent::MouseUp;
+ else if (event.type() == eventNames().contextmenuEvent)
+ type = WebInputEvent::ContextMenu;
else
return; // Skip all other mouse events.
timeStampSeconds = event.timeStamp() * 1.0e-3;
@@ -222,16 +283,42 @@ WebMouseEventBuilder::WebMouseEventBuilder(const ScrollView* view, const MouseEv
break;
}
}
- IntPoint p = view->contentsToWindow(IntPoint(event.pageX(), event.pageY()));
+ ScrollView* view = widget->parent();
+ IntPoint p = view->contentsToWindow(
+ IntPoint(event.absoluteLocation().x(), event.absoluteLocation().y()));
globalX = event.screenX();
globalY = event.screenY();
windowX = p.x();
windowY = p.y();
- x = event.offsetX();
- y = event.offsetY();
+ x = event.absoluteLocation().x() - widget->pos().x();
+ y = event.absoluteLocation().y() - widget->pos().y();
clickCount = event.detail();
}
+WebMouseWheelEventBuilder::WebMouseWheelEventBuilder(const Widget* widget, const WheelEvent& event)
+{
+ if (event.type() != eventNames().mousewheelEvent)
+ return;
+ type = WebInputEvent::MouseWheel;
+ timeStampSeconds = event.timeStamp() * 1.0e-3;
+ modifiers = getWebInputModifiers(event);
+ ScrollView* view = widget->parent();
+ IntPoint p = view->contentsToWindow(
+ IntPoint(event.absoluteLocation().x(), event.absoluteLocation().y()));
+ globalX = event.screenX();
+ globalY = event.screenY();
+ windowX = p.x();
+ windowY = p.y();
+ x = event.absoluteLocation().x() - widget->pos().x();
+ y = event.absoluteLocation().y() - widget->pos().y();
+ deltaX = static_cast<float>(event.rawDeltaX());
+ deltaY = static_cast<float>(event.rawDeltaY());
+ // The 120 is from WheelEvent::initWheelEvent().
+ wheelTicksX = static_cast<float>(event.wheelDeltaX()) / 120;
+ wheelTicksY = static_cast<float>(event.wheelDeltaY()) / 120;
+ scrollByPage = event.granularity() == WheelEvent::Page;
+}
+
WebKeyboardEventBuilder::WebKeyboardEventBuilder(const KeyboardEvent& event)
{
if (event.type() == eventNames().keydownEvent)
@@ -245,6 +332,11 @@ WebKeyboardEventBuilder::WebKeyboardEventBuilder(const KeyboardEvent& event)
modifiers = getWebInputModifiers(event);
timeStampSeconds = event.timeStamp() * 1.0e-3;
windowsKeyCode = event.keyCode();
+
+ // The platform keyevent does not exist if the event was created using
+ // initKeyboardEvent.
+ if (!event.keyEvent())
+ return;
nativeKeyCode = event.keyEvent()->nativeVirtualKeyCode();
unsigned int numChars = std::min(event.keyEvent()->text().length(),
static_cast<unsigned int>(WebKeyboardEvent::textLengthCap));
diff --git a/WebKit/chromium/src/WebInputEventConversion.h b/WebKit/chromium/src/WebInputEventConversion.h
index 4c9cf82..63991a9 100644
--- a/WebKit/chromium/src/WebInputEventConversion.h
+++ b/WebKit/chromium/src/WebInputEventConversion.h
@@ -31,18 +31,18 @@
#ifndef WebInputEventConversion_h
#define WebInputEventConversion_h
-// FIXME: This relative path is a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebInputEvent.h"
+#include "WebInputEvent.h"
#include "PlatformKeyboardEvent.h"
#include "PlatformMouseEvent.h"
+#include "PlatformTouchEvent.h"
#include "PlatformWheelEvent.h"
namespace WebCore {
class KeyboardEvent;
class MouseEvent;
class ScrollView;
+class WheelEvent;
class Widget;
}
@@ -72,20 +72,38 @@ public:
bool isCharacterKey() const;
};
+#if ENABLE(TOUCH_EVENTS)
+class PlatformTouchPointBuilder : public WebCore::PlatformTouchPoint {
+public:
+ PlatformTouchPointBuilder(WebCore::Widget*, const WebTouchPoint&);
+};
+
+class PlatformTouchEventBuilder : public WebCore::PlatformTouchEvent {
+public:
+ PlatformTouchEventBuilder(WebCore::Widget*, const WebTouchEvent&);
+};
+#endif
+
// Converts a WebCore::MouseEvent to a corresponding WebMouseEvent. view is
-// the ScrollView corresponding to the event. Returns true if successful.
+// the ScrollView corresponding to the event.
// NOTE: This is only implemented for mousemove, mouseover, mouseout,
// mousedown and mouseup. If the event mapping fails, the event type will
// be set to Undefined.
class WebMouseEventBuilder : public WebMouseEvent {
public:
- WebMouseEventBuilder(const WebCore::ScrollView*, const WebCore::MouseEvent&);
+ WebMouseEventBuilder(const WebCore::Widget*, const WebCore::MouseEvent&);
+};
+
+// Converts a WebCore::WheelEvent to a corresponding WebMouseWheelEvent.
+// If the event mapping fails, the event type will be set to Undefined.
+class WebMouseWheelEventBuilder : public WebMouseWheelEvent {
+public:
+ WebMouseWheelEventBuilder(const WebCore::Widget*, const WebCore::WheelEvent&);
};
// Converts a WebCore::KeyboardEvent to a corresponding WebKeyboardEvent.
-// Returns true if successful. NOTE: This is only implemented for keydown
-// and keyup. If the event mapping fails, the event type will be set to
-// Undefined.
+// NOTE: This is only implemented for keydown and keyup. If the event mapping
+// fails, the event type will be set to Undefined.
class WebKeyboardEventBuilder : public WebKeyboardEvent {
public:
WebKeyboardEventBuilder(const WebCore::KeyboardEvent&);
diff --git a/WebKit/chromium/src/WebKit.cpp b/WebKit/chromium/src/WebKit.cpp
index a8e1851..cadcb6c 100644
--- a/WebKit/chromium/src/WebKit.cpp
+++ b/WebKit/chromium/src/WebKit.cpp
@@ -31,7 +31,6 @@
#include "config.h"
#include "WebKit.h"
-#include "AtomicString.h"
#include "DOMTimer.h"
#include "Logging.h"
#include "Page.h"
@@ -43,20 +42,29 @@
#include <wtf/Assertions.h>
#include <wtf/Threading.h>
+#include <wtf/text/AtomicString.h>
namespace WebKit {
+// Make sure we are not re-initialized in the same address space.
+// Doing so may cause hard to reproduce crashes.
+static bool s_webKitInitialized = false;
+
static WebKitClient* s_webKitClient = 0;
static bool s_layoutTestMode = false;
void initialize(WebKitClient* webKitClient)
{
+ ASSERT(!s_webKitInitialized);
+ s_webKitInitialized = true;
+
ASSERT(webKitClient);
ASSERT(!s_webKitClient);
s_webKitClient = webKitClient;
WTF::initializeThreading();
- WebCore::AtomicString::init();
+ WTF::initializeMainThread();
+ WTF::AtomicString::init();
// Chromium sets the minimum interval timeout to 4ms, overriding the
// default of 10ms. We'd like to go lower, however there are poorly
diff --git a/WebKit/chromium/src/WebLabelElement.cpp b/WebKit/chromium/src/WebLabelElement.cpp
new file mode 100644
index 0000000..ef2c698
--- /dev/null
+++ b/WebKit/chromium/src/WebLabelElement.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebLabelElement.h"
+
+#include "HTMLLabelElement.h"
+#include "HTMLNames.h"
+#include "WebString.h"
+#include <wtf/PassRefPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebElement WebLabelElement::correspondingControl()
+{
+ return WebElement(unwrap<HTMLLabelElement>()->control());
+}
+
+WebLabelElement::WebLabelElement(const PassRefPtr<HTMLLabelElement>& elem)
+ : WebElement(elem)
+{
+}
+
+WebLabelElement& WebLabelElement::operator=(const PassRefPtr<HTMLLabelElement>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebLabelElement::operator PassRefPtr<HTMLLabelElement>() const
+{
+ return static_cast<HTMLLabelElement*>(m_private.get());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebMediaElement.cpp b/WebKit/chromium/src/WebMediaElement.cpp
new file mode 100644
index 0000000..4adda1e
--- /dev/null
+++ b/WebKit/chromium/src/WebMediaElement.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebMediaElement.h"
+
+#include "HTMLMediaElement.h"
+#include "MediaPlayer.h"
+#include "WebMediaPlayer.h"
+#include "WebMediaPlayerClientImpl.h"
+#include <wtf/PassRefPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebMediaPlayer* WebMediaElement::player() const
+{
+ return WebMediaPlayerClientImpl::fromMediaElement(this)->mediaPlayer();
+}
+
+WebMediaElement::WebMediaElement(const PassRefPtr<HTMLMediaElement>& elem)
+ : WebElement(elem)
+{
+}
+
+WebMediaElement& WebMediaElement::operator=(const PassRefPtr<HTMLMediaElement>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebMediaElement::operator PassRefPtr<HTMLMediaElement>() const
+{
+ return static_cast<HTMLMediaElement*>(m_private.get());
+}
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp b/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp
index b1f1f03..65f0fde 100644
--- a/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp
+++ b/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp
@@ -7,7 +7,6 @@
#if ENABLE(VIDEO)
-#include "CString.h"
#include "Frame.h"
#include "GraphicsContext.h"
#include "HTMLMediaElement.h"
@@ -15,20 +14,30 @@
#include "KURL.h"
#include "MediaPlayer.h"
#include "NotImplemented.h"
+#include "RenderView.h"
#include "TimeRanges.h"
+#include "VideoLayerChromium.h"
+#if USE(ACCELERATED_COMPOSITING)
+#include "RenderLayerCompositor.h"
+#endif
+
+#include "VideoFrameChromium.h"
+#include "VideoFrameChromiumImpl.h"
#include "WebCanvas.h"
#include "WebCString.h"
#include "WebFrameClient.h"
#include "WebFrameImpl.h"
#include "WebKit.h"
#include "WebKitClient.h"
+#include "WebMediaElement.h"
#include "WebMediaPlayer.h"
#include "WebMimeRegistry.h"
#include "WebRect.h"
#include "WebSize.h"
#include "WebString.h"
#include "WebURL.h"
+#include "WebViewImpl.h"
// WebCommon.h defines WEBKIT_USING_SKIA so this has to be included last.
#if WEBKIT_USING_SKIA
@@ -36,6 +45,7 @@
#endif
#include <wtf/Assertions.h>
+#include <wtf/text/CString.h>
using namespace WebCore;
@@ -45,6 +55,7 @@ static WebMediaPlayer* createWebMediaPlayer(
WebMediaPlayerClient* client, Frame* frame)
{
WebFrameImpl* webFrame = WebFrameImpl::fromFrame(frame);
+
if (!webFrame->client())
return 0;
return webFrame->client()->createMediaPlayer(webFrame, client);
@@ -71,8 +82,29 @@ void WebMediaPlayerClientImpl::registerSelf(MediaEngineRegistrar registrar)
}
}
+WebMediaPlayerClientImpl* WebMediaPlayerClientImpl::fromMediaElement(const WebMediaElement* element)
+{
+ PlatformMedia pm = element->constUnwrap<HTMLMediaElement>()->platformMedia();
+ return static_cast<WebMediaPlayerClientImpl*>(pm.media.chromiumMediaPlayer);
+}
+
+WebMediaPlayer* WebMediaPlayerClientImpl::mediaPlayer() const
+{
+ return m_webMediaPlayer.get();
+}
+
// WebMediaPlayerClient --------------------------------------------------------
+WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl()
+{
+ // VideoLayerChromium may outlive this object so make sure all frames are
+ // released.
+#if USE(ACCELERATED_COMPOSITING)
+ if (m_videoLayer.get())
+ m_videoLayer->releaseCurrentFrame();
+#endif
+}
+
void WebMediaPlayerClientImpl::networkStateChanged()
{
ASSERT(m_mediaPlayer);
@@ -83,6 +115,10 @@ void WebMediaPlayerClientImpl::readyStateChanged()
{
ASSERT(m_mediaPlayer);
m_mediaPlayer->readyStateChanged();
+#if USE(ACCELERATED_COMPOSITING)
+ if (hasVideo() && supportsAcceleratedRendering() && !m_videoLayer.get())
+ m_videoLayer = VideoLayerChromium::create(0, this);
+#endif
}
void WebMediaPlayerClientImpl::volumeChanged(float newVolume)
@@ -106,6 +142,10 @@ void WebMediaPlayerClientImpl::timeChanged()
void WebMediaPlayerClientImpl::repaint()
{
ASSERT(m_mediaPlayer);
+#if USE(ACCELERATED_COMPOSITING)
+ if (m_videoLayer.get() && supportsAcceleratedRendering())
+ m_videoLayer->setNeedsDisplay(FloatRect(0, 0, m_videoLayer->bounds().width(), m_videoLayer->bounds().height()));
+#endif
m_mediaPlayer->repaint();
}
@@ -133,12 +173,27 @@ void WebMediaPlayerClientImpl::sawUnsupportedTracks()
m_mediaPlayer->mediaPlayerClient()->mediaPlayerSawUnsupportedTracks(m_mediaPlayer);
}
+float WebMediaPlayerClientImpl::volume() const
+{
+ if (m_mediaPlayer)
+ return m_mediaPlayer->volume();
+ return 0.0f;
+}
+
// MediaPlayerPrivateInterface -------------------------------------------------
void WebMediaPlayerClientImpl::load(const String& url)
{
Frame* frame = static_cast<HTMLMediaElement*>(
m_mediaPlayer->mediaPlayerClient())->document()->frame();
+
+ // Video frame object is owned by WebMediaPlayer. Before destroying
+ // WebMediaPlayer all frames need to be released.
+#if USE(ACCELERATED_COMPOSITING)
+ if (m_videoLayer.get())
+ m_videoLayer->releaseCurrentFrame();
+#endif
+
m_webMediaPlayer.set(createWebMediaPlayer(this, frame));
if (m_webMediaPlayer.get())
m_webMediaPlayer->load(KURL(ParsedURLString, url));
@@ -150,6 +205,22 @@ void WebMediaPlayerClientImpl::cancelLoad()
m_webMediaPlayer->cancelLoad();
}
+#if USE(ACCELERATED_COMPOSITING)
+PlatformLayer* WebMediaPlayerClientImpl::platformLayer() const
+{
+ ASSERT(m_supportsAcceleratedCompositing);
+ return m_videoLayer.get();
+}
+#endif
+
+PlatformMedia WebMediaPlayerClientImpl::platformMedia() const
+{
+ PlatformMedia pm;
+ pm.type = PlatformMedia::ChromiumMediaPlayerType;
+ pm.media.chromiumMediaPlayer = const_cast<WebMediaPlayerClientImpl*>(this);
+ return pm;
+}
+
void WebMediaPlayerClientImpl::play()
{
if (m_webMediaPlayer.get())
@@ -331,7 +402,14 @@ void WebMediaPlayerClientImpl::paint(GraphicsContext* context, const IntRect& re
// check.
if (m_webMediaPlayer.get() && !context->paintingDisabled()) {
#if WEBKIT_USING_SKIA
- m_webMediaPlayer->paint(context->platformContext()->canvas(), rect);
+ PlatformGraphicsContext* platformContext = context->platformContext();
+ WebCanvas* canvas = platformContext->canvas();
+
+ canvas->saveLayerAlpha(0, platformContext->getNormalizedAlpha());
+
+ m_webMediaPlayer->paint(canvas, rect);
+
+ canvas->restore();
#elif WEBKIT_USING_CG
m_webMediaPlayer->paint(context->platformContext(), rect);
#else
@@ -361,10 +439,52 @@ MediaPlayer::MovieLoadType WebMediaPlayerClientImpl::movieLoadType() const
return MediaPlayer::Unknown;
}
+#if USE(ACCELERATED_COMPOSITING)
+bool WebMediaPlayerClientImpl::supportsAcceleratedRendering() const
+{
+ return m_supportsAcceleratedCompositing;
+}
+
+VideoFrameChromium* WebMediaPlayerClientImpl::getCurrentFrame()
+{
+ VideoFrameChromium* videoFrame = 0;
+ if (m_webMediaPlayer.get()) {
+ WebVideoFrame* webkitVideoFrame = m_webMediaPlayer->getCurrentFrame();
+ if (webkitVideoFrame)
+ videoFrame = new VideoFrameChromiumImpl(webkitVideoFrame);
+ }
+ return videoFrame;
+}
+
+void WebMediaPlayerClientImpl::putCurrentFrame(VideoFrameChromium* videoFrame)
+{
+ if (videoFrame) {
+ if (m_webMediaPlayer.get()) {
+ m_webMediaPlayer->putCurrentFrame(
+ VideoFrameChromiumImpl::toWebVideoFrame(videoFrame));
+ }
+ delete videoFrame;
+ }
+}
+#endif
+
MediaPlayerPrivateInterface* WebMediaPlayerClientImpl::create(MediaPlayer* player)
{
WebMediaPlayerClientImpl* client = new WebMediaPlayerClientImpl();
client->m_mediaPlayer = player;
+
+#if USE(ACCELERATED_COMPOSITING)
+ Frame* frame = static_cast<HTMLMediaElement*>(
+ client->m_mediaPlayer->mediaPlayerClient())->document()->frame();
+
+ // This does not actually check whether the hardware can support accelerated
+ // compositing, but only if the flag is set. However, this is checked lazily
+ // in WebViewImpl::setIsAcceleratedCompositingActive() and will fail there
+ // if necessary.
+ client->m_supportsAcceleratedCompositing =
+ frame->contentRenderer()->compositor()->hasAcceleratedCompositing();
+#endif
+
return client;
}
@@ -395,6 +515,10 @@ MediaPlayer::SupportsType WebMediaPlayerClientImpl::supportsType(const String& t
WebMediaPlayerClientImpl::WebMediaPlayerClientImpl()
: m_mediaPlayer(0)
+#if USE(ACCELERATED_COMPOSITING)
+ , m_videoLayer(0)
+ , m_supportsAcceleratedCompositing(false)
+#endif
{
}
diff --git a/WebKit/chromium/src/WebMediaPlayerClientImpl.h b/WebKit/chromium/src/WebMediaPlayerClientImpl.h
index 4adbed2..ca7c43c 100644
--- a/WebKit/chromium/src/WebMediaPlayerClientImpl.h
+++ b/WebKit/chromium/src/WebMediaPlayerClientImpl.h
@@ -34,23 +34,37 @@
#if ENABLE(VIDEO)
#include "MediaPlayerPrivate.h"
+#include "VideoFrameChromium.h"
+#include "VideoFrameProvider.h"
+#include "VideoLayerChromium.h"
#include "WebMediaPlayerClient.h"
#include <wtf/OwnPtr.h>
namespace WebKit {
+class WebMediaElement;
class WebMediaPlayer;
// This class serves as a bridge between WebCore::MediaPlayer and
// WebKit::WebMediaPlayer.
-class WebMediaPlayerClientImpl : public WebMediaPlayerClient
- , public WebCore::MediaPlayerPrivateInterface {
+class WebMediaPlayerClientImpl : public WebCore::MediaPlayerPrivateInterface
+#if USE(ACCELERATED_COMPOSITING)
+ , public WebCore::VideoFrameProvider
+#endif
+ , public WebMediaPlayerClient {
+
public:
static bool isEnabled();
static void setIsEnabled(bool);
static void registerSelf(WebCore::MediaEngineRegistrar);
+ static WebMediaPlayerClientImpl* fromMediaElement(const WebMediaElement* element);
+
+ // Returns the encapsulated WebKit::WebMediaPlayer.
+ WebMediaPlayer* mediaPlayer() const;
+
// WebMediaPlayerClient methods:
+ virtual ~WebMediaPlayerClientImpl();
virtual void networkStateChanged();
virtual void readyStateChanged();
virtual void volumeChanged(float);
@@ -61,10 +75,15 @@ public:
virtual void rateChanged();
virtual void sizeChanged();
virtual void sawUnsupportedTracks();
+ virtual float volume() const;
// MediaPlayerPrivateInterface methods:
- virtual void load(const WebCore::String& url);
+ virtual void load(const WTF::String& url);
virtual void cancelLoad();
+#if USE(ACCELERATED_COMPOSITING)
+ virtual WebCore::PlatformLayer* platformLayer() const;
+#endif
+ virtual WebCore::PlatformMedia platformMedia() const;
virtual void play();
virtual void pause();
virtual bool supportsFullscreen() const;
@@ -94,17 +113,28 @@ public:
virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&);
virtual bool hasSingleSecurityOrigin() const;
virtual WebCore::MediaPlayer::MovieLoadType movieLoadType() const;
+#if USE(ACCELERATED_COMPOSITING)
+ virtual bool supportsAcceleratedRendering() const;
+
+ // VideoFrameProvider methods:
+ virtual WebCore::VideoFrameChromium* getCurrentFrame();
+ virtual void putCurrentFrame(WebCore::VideoFrameChromium*);
+#endif
private:
WebMediaPlayerClientImpl();
static WebCore::MediaPlayerPrivateInterface* create(WebCore::MediaPlayer*);
- static void getSupportedTypes(WTF::HashSet<WebCore::String>&);
+ static void getSupportedTypes(WTF::HashSet<WTF::String>&);
static WebCore::MediaPlayer::SupportsType supportsType(
- const WebCore::String& type, const WebCore::String& codecs);
+ const WTF::String& type, const WTF::String& codecs);
WebCore::MediaPlayer* m_mediaPlayer;
OwnPtr<WebMediaPlayer> m_webMediaPlayer;
+#if USE(ACCELERATED_COMPOSITING)
+ RefPtr<WebCore::VideoLayerChromium> m_videoLayer;
+ bool m_supportsAcceleratedCompositing;
+#endif
static bool m_isEnabled;
};
diff --git a/WebKit/chromium/src/WebNamedNodeMap.cpp b/WebKit/chromium/src/WebNamedNodeMap.cpp
new file mode 100644
index 0000000..e2455e6
--- /dev/null
+++ b/WebKit/chromium/src/WebNamedNodeMap.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebNamedNodeMap.h"
+
+#include "NamedNodeMap.h"
+#include "Node.h"
+#include "WebAttribute.h"
+#include "WebNode.h"
+#include <wtf/PassRefPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebNamedNodeMap::reset()
+{
+ m_private.reset();
+}
+
+void WebNamedNodeMap::assign(const WebNamedNodeMap& other)
+{
+ m_private = other.m_private;
+}
+
+WebNamedNodeMap::WebNamedNodeMap(const PassRefPtr<NamedNodeMap>& other)
+ : m_private(other)
+{
+}
+
+unsigned WebNamedNodeMap::length() const
+{
+ return m_private->length();
+}
+
+WebAttribute WebNamedNodeMap::attributeItem(unsigned index) const
+{
+ return WebAttribute(m_private->attributeItem(index));
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebNode.cpp b/WebKit/chromium/src/WebNode.cpp
index 9fbf573..e91d1ee 100644
--- a/WebKit/chromium/src/WebNode.cpp
+++ b/WebKit/chromium/src/WebNode.cpp
@@ -32,15 +32,16 @@
#include "WebNode.h"
#include "Document.h"
+#include "Element.h"
#include "Frame.h"
#include "FrameLoaderClientImpl.h"
#include "Node.h"
#include "NodeList.h"
#include "EventListenerWrapper.h"
+#include "WebDOMEvent.h"
+#include "WebDOMEventListener.h"
#include "WebDocument.h"
-#include "WebEvent.h"
-#include "WebEventListener.h"
#include "WebFrameImpl.h"
#include "WebNodeList.h"
#include "WebString.h"
@@ -48,26 +49,28 @@
#include "markup.h"
-#include <wtf/PassRefPtr.h>
-
using namespace WebCore;
namespace WebKit {
-class WebNodePrivate : public Node {
-};
-
void WebNode::reset()
{
- assign(0);
+ m_private.reset();
}
void WebNode::assign(const WebNode& other)
{
- WebNodePrivate* p = const_cast<WebNodePrivate*>(other.m_private);
- if (p)
- p->ref();
- assign(p);
+ m_private = other.m_private;
+}
+
+bool WebNode::equals(const WebNode& n) const
+{
+ return (m_private.get() == n.m_private.get());
+}
+
+bool WebNode::lessThan(const WebNode& n) const
+{
+ return (m_private.get() < n.m_private.get());
}
WebNode::NodeType WebNode::nodeType() const
@@ -77,7 +80,7 @@ WebNode::NodeType WebNode::nodeType() const
WebNode WebNode::parentNode() const
{
- return PassRefPtr<Node>(const_cast<Node*>(m_private->parentNode()));
+ return WebNode(const_cast<ContainerNode*>(m_private->parentNode()));
}
WebString WebNode::nodeName() const
@@ -97,35 +100,6 @@ bool WebNode::setNodeValue(const WebString& value)
return !exceptionCode;
}
-WebNode::WebNode(const PassRefPtr<Node>& node)
- : m_private(static_cast<WebNodePrivate*>(node.releaseRef()))
-{
-}
-
-WebNode& WebNode::operator=(const PassRefPtr<Node>& node)
-{
- assign(static_cast<WebNodePrivate*>(node.releaseRef()));
- return *this;
-}
-
-WebNode::operator PassRefPtr<Node>() const
-{
- return PassRefPtr<Node>(const_cast<WebNodePrivate*>(m_private));
-}
-
-void WebNode::assign(WebNodePrivate* p)
-{
- // p is already ref'd for us by the caller
- if (m_private)
- m_private->deref();
- m_private = p;
-}
-
-WebFrame* WebNode::frame() const
-{
- return WebFrameImpl::fromFrame(m_private->document()->frame());
-}
-
WebDocument WebNode::document() const
{
return WebDocument(m_private->document());
@@ -163,7 +137,7 @@ WebNodeList WebNode::childNodes()
WebString WebNode::createMarkup() const
{
- return WebCore::createMarkup(m_private);
+ return WebCore::createMarkup(m_private.get());
}
bool WebNode::isTextNode() const
@@ -171,27 +145,64 @@ bool WebNode::isTextNode() const
return m_private->isTextNode();
}
+bool WebNode::isContentEditable() const
+{
+ return m_private->isContentEditable();
+}
+
bool WebNode::isElementNode() const
{
return m_private->isElementNode();
}
-void WebNode::addEventListener(const WebString& eventType, WebEventListener* listener, bool useCapture)
+void WebNode::addEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture)
{
EventListenerWrapper* listenerWrapper =
- listener->createEventListenerWrapper(eventType, useCapture, m_private);
+ listener->createEventListenerWrapper(eventType, useCapture, m_private.get());
// The listenerWrapper is only referenced by the actual Node. Once it goes
// away, the wrapper notifies the WebEventListener so it can clear its
// pointer to it.
m_private->addEventListener(eventType, adoptRef(listenerWrapper), useCapture);
}
-void WebNode::removeEventListener(const WebString& eventType, WebEventListener* listener, bool useCapture)
+void WebNode::removeEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture)
{
EventListenerWrapper* listenerWrapper =
- listener->getEventListenerWrapper(eventType, useCapture, m_private);
+ listener->getEventListenerWrapper(eventType, useCapture, m_private.get());
m_private->removeEventListener(eventType, listenerWrapper, useCapture);
// listenerWrapper is now deleted.
}
+void WebNode::simulateClick()
+{
+ RefPtr<Event> noEvent;
+ m_private->dispatchSimulatedClick(noEvent);
+}
+
+WebNodeList WebNode::getElementsByTagName(const WebString& tag) const
+{
+ return WebNodeList(m_private->getElementsByTagName(tag));
+}
+
+bool WebNode::hasNonEmptyBoundingBox() const
+{
+ return m_private->hasNonEmptyBoundingBox();
+}
+
+WebNode::WebNode(const PassRefPtr<Node>& node)
+ : m_private(node)
+{
+}
+
+WebNode& WebNode::operator=(const PassRefPtr<Node>& node)
+{
+ m_private = node;
+ return *this;
+}
+
+WebNode::operator PassRefPtr<Node>() const
+{
+ return m_private.get();
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebNotification.cpp b/WebKit/chromium/src/WebNotification.cpp
index 1f6916e..c3b1f51 100644
--- a/WebKit/chromium/src/WebNotification.cpp
+++ b/WebKit/chromium/src/WebNotification.cpp
@@ -34,8 +34,10 @@
#if ENABLE(NOTIFICATIONS)
#include "Notification.h"
+#include "UserGestureIndicator.h"
#include "WebString.h"
+#include "WebTextDirection.h"
#include "WebURL.h"
#include <wtf/PassRefPtr.h>
@@ -76,10 +78,10 @@ WebURL WebNotification::url() const
return m_private->url();
}
-WebString WebNotification::icon() const
+WebURL WebNotification::iconURL() const
{
ASSERT(!isHTML());
- return m_private->contents().icon();
+ return m_private->iconURL();
}
WebString WebNotification::title() const
@@ -94,6 +96,29 @@ WebString WebNotification::body() const
return m_private->contents().body();
}
+// FIXME: remove dir() when unreferenced. Being replaced by direction().
+WebString WebNotification::dir() const
+{
+ return m_private->dir();
+}
+
+WebTextDirection WebNotification::direction() const
+{
+ return (m_private->direction() == RTL) ?
+ WebTextDirectionRightToLeft :
+ WebTextDirectionLeftToRight;
+}
+
+WebString WebNotification::replaceId() const
+{
+ return m_private->replaceId();
+}
+
+void WebNotification::detachPresenter()
+{
+ m_private->detachPresenter();
+}
+
void WebNotification::dispatchDisplayEvent()
{
RefPtr<Event> event = Event::create("display", false, true);
@@ -114,6 +139,14 @@ void WebNotification::dispatchCloseEvent(bool /* byUser */)
m_private->dispatchEvent(event.release());
}
+void WebNotification::dispatchClickEvent()
+{
+ // Make sure clicks on notifications are treated as user gestures.
+ UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
+ RefPtr<Event> event = Event::create(eventNames().clickEvent, false, true);
+ m_private->dispatchEvent(event.release());
+}
+
WebNotification::WebNotification(const WTF::PassRefPtr<Notification>& notification)
: m_private(static_cast<WebNotificationPrivate*>(notification.releaseRef()))
{
diff --git a/WebKit/chromium/src/AutocompletePopupMenuClient.cpp b/WebKit/chromium/src/WebOptionElement.cpp
index 9620ffc..49bff3b 100644
--- a/WebKit/chromium/src/AutocompletePopupMenuClient.cpp
+++ b/WebKit/chromium/src/WebOptionElement.cpp
@@ -29,56 +29,72 @@
*/
#include "config.h"
-#include "AutocompletePopupMenuClient.h"
+#include "WebOptionElement.h"
-#include "HTMLInputElement.h"
+#include "HTMLNames.h"
+#include "HTMLOptionElement.h"
+#include "HTMLSelectElement.h"
#include "WebString.h"
-#include "WebVector.h"
+#include <wtf/PassRefPtr.h>
using namespace WebCore;
namespace WebKit {
-unsigned AutocompletePopupMenuClient::getSuggestionsCount() const
+void WebOptionElement::setValue(const WebString& newValue)
{
- return m_suggestions.size();
+ return unwrap<HTMLOptionElement>()->setValue(newValue);
}
-WebString AutocompletePopupMenuClient::getSuggestion(unsigned listIndex) const
+WebString WebOptionElement::value() const
{
- ASSERT(listIndex >= 0 && listIndex < m_suggestions.size());
- return m_suggestions[listIndex];
+ return constUnwrap<HTMLOptionElement>()->value();
}
-void AutocompletePopupMenuClient::removeSuggestionAtIndex(unsigned listIndex)
+int WebOptionElement::index() const
{
- ASSERT(listIndex >= 0 && listIndex < m_suggestions.size());
- m_suggestions.remove(listIndex);
+ return constUnwrap<HTMLOptionElement>()->index();
}
-void AutocompletePopupMenuClient::initialize(
- HTMLInputElement* textField,
- const WebVector<WebString>& suggestions,
- int defaultSuggestionIndex)
+WebString WebOptionElement::text() const
{
- ASSERT(defaultSuggestionIndex < static_cast<int>(suggestions.size()));
+ return constUnwrap<HTMLOptionElement>()->text();
+}
+
+bool WebOptionElement::defaultSelected() const
+{
+ return constUnwrap<HTMLOptionElement>()->defaultSelected();
+}
- // The suggestions must be set before initializing the
- // SuggestionsPopupMenuClient.
- setSuggestions(suggestions);
+void WebOptionElement::setDefaultSelected(bool newSelected)
+{
+ return unwrap<HTMLOptionElement>()->setDefaultSelected(newSelected);
+}
- SuggestionsPopupMenuClient::initialize(textField, defaultSuggestionIndex);
+WebString WebOptionElement::label() const
+{
+ return constUnwrap<HTMLOptionElement>()->label();
}
-void AutocompletePopupMenuClient::setSuggestions(const WebVector<WebString>& suggestions)
+bool WebOptionElement::isEnabled() const
{
- m_suggestions.clear();
- for (size_t i = 0; i < suggestions.size(); ++i)
- m_suggestions.append(suggestions[i]);
+ return !(constUnwrap<HTMLOptionElement>()->disabled());
+}
- // Try to preserve selection if possible.
- if (getSelectedIndex() >= static_cast<int>(suggestions.size()))
- setSelectedIndex(-1);
+WebOptionElement::WebOptionElement(const PassRefPtr<HTMLOptionElement>& elem)
+ : WebFormControlElement(elem)
+{
+}
+
+WebOptionElement& WebOptionElement::operator=(const PassRefPtr<HTMLOptionElement>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebOptionElement::operator PassRefPtr<HTMLOptionElement>() const
+{
+ return static_cast<HTMLOptionElement*>(m_private.get());
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebPageSerializer.cpp b/WebKit/chromium/src/WebPageSerializer.cpp
index 1010285..1fda484 100644
--- a/WebKit/chromium/src/WebPageSerializer.cpp
+++ b/WebKit/chromium/src/WebPageSerializer.cpp
@@ -32,7 +32,6 @@
#include "WebPageSerializer.h"
#include "KURL.h"
-#include "PlatformString.h"
#include "WebFrame.h"
#include "WebPageSerializerClient.h"
@@ -41,6 +40,8 @@
#include "WebURL.h"
#include "WebVector.h"
+#include <wtf/text/StringConcatenate.h>
+
using namespace WebCore;
namespace WebKit {
@@ -59,8 +60,7 @@ bool WebPageSerializer::serialize(WebFrame* frame,
WebString WebPageSerializer::generateMetaCharsetDeclaration(const WebString& charset)
{
- return String::format("<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">",
- charset.utf8().data());
+ return makeString("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=", static_cast<const String&>(charset), "\">");
}
WebString WebPageSerializer::generateMarkOfTheWebDeclaration(const WebURL& url)
@@ -72,10 +72,9 @@ WebString WebPageSerializer::generateMarkOfTheWebDeclaration(const WebURL& url)
WebString WebPageSerializer::generateBaseTagDeclaration(const WebString& baseTarget)
{
- String targetDeclaration;
- if (!baseTarget.isEmpty())
- targetDeclaration = String::format(" target=\"%s\"", baseTarget.utf8().data());
- return String::format("<BASE href=\".\"%s>", targetDeclaration.utf8().data());
+ if (baseTarget.isEmpty())
+ return makeString("<base href=\".\">");
+ return makeString("<base href=\".\" target=\"", static_cast<const String&>(baseTarget), "\">");
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebPageSerializerImpl.cpp b/WebKit/chromium/src/WebPageSerializerImpl.cpp
index d5b2b7f..0d85d78 100644
--- a/WebKit/chromium/src/WebPageSerializerImpl.cpp
+++ b/WebKit/chromium/src/WebPageSerializerImpl.cpp
@@ -88,8 +88,6 @@
#include "HTMLMetaElement.h"
#include "HTMLNames.h"
#include "KURL.h"
-#include "PlatformString.h"
-#include "StringBuilder.h"
#include "TextEncoding.h"
#include "markup.h"
@@ -107,22 +105,22 @@ namespace WebKit {
// contegious string is found in the page.
static const unsigned dataBufferCapacity = 65536;
-WebPageSerializerImpl::SerializeDomParam::SerializeDomParam(const KURL& currentFrameURL,
+WebPageSerializerImpl::SerializeDomParam::SerializeDomParam(const KURL& url,
const TextEncoding& textEncoding,
- Document* doc,
+ Document* document,
const String& directoryName)
- : currentFrameURL(currentFrameURL)
+ : url(url)
, textEncoding(textEncoding)
- , doc(doc)
+ , document(document)
, directoryName(directoryName)
- , hasDoctype(false)
- , hasCheckedMeta(false)
+ , isHTMLDocument(document->isHTMLDocument())
+ , haveSeenDocType(false)
+ , haveAddedCharsetDeclaration(false)
, skipMetaElement(0)
, isInScriptOrStyleTag(false)
- , hasDocDeclaration(false)
+ , haveAddedXMLProcessingDirective(false)
+ , haveAddedContentsBeforeEnd(false)
{
- // Cache the value since we check it lots of times.
- isHTMLDocument = doc->isHTMLDocument();
}
String WebPageSerializerImpl::preActionBeforeSerializeOpenTag(
@@ -150,41 +148,41 @@ String WebPageSerializerImpl::preActionBeforeSerializeOpenTag(
}
} else if (element->hasTagName(HTMLNames::htmlTag)) {
// Check something before processing the open tag of HEAD element.
- // First we add doc type declaration if original doc has it.
- if (!param->hasDoctype) {
- param->hasDoctype = true;
- result.append(createMarkup(param->doc->doctype()));
+ // First we add doc type declaration if original document has it.
+ if (!param->haveSeenDocType) {
+ param->haveSeenDocType = true;
+ result.append(createMarkup(param->document->doctype()));
}
// Add MOTW declaration before html tag.
// See http://msdn2.microsoft.com/en-us/library/ms537628(VS.85).aspx.
- result.append(WebPageSerializer::generateMarkOfTheWebDeclaration(param->currentFrameURL));
+ result.append(WebPageSerializer::generateMarkOfTheWebDeclaration(param->url));
} else if (element->hasTagName(HTMLNames::baseTag)) {
// Comment the BASE tag when serializing dom.
result.append("<!--");
}
} else {
// Write XML declaration.
- if (!param->hasDocDeclaration) {
- param->hasDocDeclaration = true;
+ if (!param->haveAddedXMLProcessingDirective) {
+ param->haveAddedXMLProcessingDirective = true;
// Get encoding info.
- String xmlEncoding = param->doc->xmlEncoding();
+ String xmlEncoding = param->document->xmlEncoding();
if (xmlEncoding.isEmpty())
- xmlEncoding = param->doc->frame()->loader()->encoding();
+ xmlEncoding = param->document->frame()->loader()->writer()->encoding();
if (xmlEncoding.isEmpty())
xmlEncoding = UTF8Encoding().name();
result.append("<?xml version=\"");
- result.append(param->doc->xmlVersion());
+ result.append(param->document->xmlVersion());
result.append("\" encoding=\"");
result.append(xmlEncoding);
- if (param->doc->xmlStandalone())
+ if (param->document->xmlStandalone())
result.append("\" standalone=\"yes");
result.append("\"?>\n");
}
- // Add doc type declaration if original doc has it.
- if (!param->hasDoctype) {
- param->hasDoctype = true;
- result.append(createMarkup(param->doc->doctype()));
+ // Add doc type declaration if original document has it.
+ if (!param->haveSeenDocType) {
+ param->haveSeenDocType = true;
+ result.append(createMarkup(param->document->doctype()));
}
}
return result.toString();
@@ -195,13 +193,13 @@ String WebPageSerializerImpl::postActionAfterSerializeOpenTag(
{
StringBuilder result;
- param->hasAddedContentsBeforeEnd = false;
+ param->haveAddedContentsBeforeEnd = false;
if (!param->isHTMLDocument)
return result.toString();
// Check after processing the open tag of HEAD element
- if (!param->hasCheckedMeta
+ if (!param->haveAddedCharsetDeclaration
&& element->hasTagName(HTMLNames::headTag)) {
- param->hasCheckedMeta = true;
+ param->haveAddedCharsetDeclaration = true;
// Check meta element. WebKit only pre-parse the first 512 bytes
// of the document. If the whole <HEAD> is larger and meta is the
// end of head part, then this kind of pages aren't decoded correctly
@@ -212,7 +210,7 @@ String WebPageSerializerImpl::postActionAfterSerializeOpenTag(
result.append(WebPageSerializer::generateMetaCharsetDeclaration(
String(param->textEncoding.name())));
- param->hasAddedContentsBeforeEnd = true;
+ param->haveAddedContentsBeforeEnd = true;
// Will search each META which has charset declaration, and skip them all
// in PreActionBeforeSerializeOpenTag.
} else if (element->hasTagName(HTMLNames::scriptTag)
@@ -259,7 +257,7 @@ String WebPageSerializerImpl::postActionAfterSerializeEndTag(
result.append("-->");
// Append a new base tag declaration.
result.append(WebPageSerializer::generateBaseTagDeclaration(
- param->doc->baseTarget()));
+ param->document->baseTarget()));
}
return result.toString();
@@ -271,27 +269,27 @@ void WebPageSerializerImpl::saveHTMLContentToBuffer(
m_dataBuffer.append(result);
encodeAndFlushBuffer(WebPageSerializerClient::CurrentFrameIsNotFinished,
param,
- 0);
+ DoNotForceFlush);
}
void WebPageSerializerImpl::encodeAndFlushBuffer(
WebPageSerializerClient::PageSerializationStatus status,
SerializeDomParam* param,
- bool force)
+ FlushOption flushOption)
{
// Data buffer is not full nor do we want to force flush.
- if (!force && m_dataBuffer.length() <= dataBufferCapacity)
+ if (flushOption != ForceFlush && m_dataBuffer.length() <= dataBufferCapacity)
return;
String content = m_dataBuffer.toString();
- m_dataBuffer.clear();
+ m_dataBuffer = StringBuilder();
// Convert the unicode content to target encoding
CString encodedContent = param->textEncoding.encode(
content.characters(), content.length(), EntitiesForUnencodables);
// Send result to the client.
- m_client->didSerializeDataForFrame(param->currentFrameURL,
+ m_client->didSerializeDataForFrame(param->url,
WebCString(encodedContent.data(), encodedContent.length()),
status);
}
@@ -306,7 +304,7 @@ void WebPageSerializerImpl::openTagToString(const Element* element,
if (needSkip)
return;
// Add open tag
- result += "<" + element->nodeName();
+ result += "<" + element->nodeName().lower();
// Go through all attributes and serialize them.
const NamedNodeMap *attrMap = element->attributes(true);
if (attrMap) {
@@ -329,7 +327,7 @@ void WebPageSerializerImpl::openTagToString(const Element* element,
result += attrValue;
else {
// Get the absolute link
- String completeURL = param->doc->completeURL(attrValue);
+ String completeURL = param->document->completeURL(attrValue);
// Check whether we have local files for those link.
if (m_localLinks.contains(completeURL)) {
if (!m_localDirectoryName.isEmpty())
@@ -352,7 +350,7 @@ void WebPageSerializerImpl::openTagToString(const Element* element,
// Do post action for open tag.
String addedContents = postActionAfterSerializeOpenTag(element, param);
// Complete the open tag for element when it has child/children.
- if (element->hasChildNodes() || param->hasAddedContentsBeforeEnd)
+ if (element->hasChildNodes() || param->haveAddedContentsBeforeEnd)
result += ">";
// Append the added contents generate in post action of open tag.
result += addedContents;
@@ -372,20 +370,19 @@ void WebPageSerializerImpl::endTagToString(const Element* element,
if (needSkip)
return;
// Write end tag when element has child/children.
- if (element->hasChildNodes() || param->hasAddedContentsBeforeEnd) {
+ if (element->hasChildNodes() || param->haveAddedContentsBeforeEnd) {
result += "</";
- result += element->nodeName();
+ result += element->nodeName().lower();
result += ">";
} else {
// Check whether we have to write end tag for empty element.
if (param->isHTMLDocument) {
result += ">";
- const HTMLElement* htmlElement =
- static_cast<const HTMLElement*>(element);
- if (htmlElement->endTagRequirement() == TagStatusRequired) {
+ // FIXME: This code is horribly wrong. WebPageSerializerImpl must die.
+ if (!static_cast<const HTMLElement*>(element)->ieForbidsInsertHTML()) {
// We need to write end tag when it is required.
result += "</";
- result += element->nodeName();
+ result += element->nodeName().lower();
result += ">";
}
} else {
@@ -423,7 +420,7 @@ void WebPageSerializerImpl::buildContentForNode(const Node* node,
break;
// Document type node can be in DOM?
case Node::DOCUMENT_TYPE_NODE:
- param->hasDoctype = true;
+ param->haveSeenDocType = true;
default:
// For other type node, call default action.
saveHTMLContentToBuffer(createMarkup(node), param);
@@ -457,7 +454,7 @@ WebPageSerializerImpl::WebPageSerializerImpl(WebFrame* frame,
m_localLinks.set(url.string(), localPaths[i]);
}
- ASSERT(!m_dataBuffer.length());
+ ASSERT(m_dataBuffer.isEmpty());
}
void WebPageSerializerImpl::collectTargetFrames()
@@ -492,55 +489,37 @@ void WebPageSerializerImpl::collectTargetFrames()
bool WebPageSerializerImpl::serialize()
{
- // Collect target frames.
if (!m_framesCollected)
collectTargetFrames();
+
bool didSerialization = false;
- // Get KURL for main frame.
- KURL mainPageURL = m_specifiedWebFrameImpl->frame()->loader()->url();
+ KURL mainURL = m_specifiedWebFrameImpl->frame()->document()->url();
- // Go through all frames for serializing DOM for whole page, include
- // sub-frames.
- for (int i = 0; i < static_cast<int>(m_frames.size()); ++i) {
- // Get current serializing frame.
- WebFrameImpl* currentFrame = m_frames[i];
- // Get current using document.
- Document* currentDoc = currentFrame->frame()->document();
- // Get current frame's URL.
- const KURL& currentFrameURL = currentFrame->frame()->loader()->url();
-
- // Check whether we have done this document.
- if (m_localLinks.contains(currentFrameURL.string())) {
- // A new document, we will serialize it.
- didSerialization = true;
- // Get target encoding for current document.
- String encoding = currentFrame->frame()->loader()->encoding();
- // Create the text encoding object with target encoding.
- TextEncoding textEncoding(encoding);
- // Construct serialize parameter for late processing document.
- SerializeDomParam param(currentFrameURL,
- encoding.length() ? textEncoding : UTF8Encoding(),
- currentDoc,
- currentFrameURL == mainPageURL ? m_localDirectoryName : "");
-
- // Process current document.
- Element* rootElement = currentDoc->documentElement();
- if (rootElement)
- buildContentForNode(rootElement, &param);
-
- // Flush the remainder data and finish serializing current frame.
- encodeAndFlushBuffer(WebPageSerializerClient::CurrentFrameIsFinished,
- &param,
- 1);
- }
+ for (unsigned i = 0; i < m_frames.size(); ++i) {
+ WebFrameImpl* webFrame = m_frames[i];
+ Document* document = webFrame->frame()->document();
+ const KURL& url = document->url();
+
+ if (!url.isValid() || !m_localLinks.contains(url.string()))
+ continue;
+
+ didSerialization = true;
+
+ String encoding = webFrame->frame()->loader()->writer()->encoding();
+ const TextEncoding& textEncoding = encoding.isEmpty() ? UTF8Encoding() : TextEncoding(encoding);
+ String directoryName = url == mainURL ? m_localDirectoryName : "";
+
+ SerializeDomParam param(url, textEncoding, document, directoryName);
+
+ Element* documentElement = document->documentElement();
+ if (documentElement)
+ buildContentForNode(documentElement, &param);
+
+ encodeAndFlushBuffer(WebPageSerializerClient::CurrentFrameIsFinished, &param, ForceFlush);
}
- // We have done call frames, so we send message to embedder to tell it that
- // frames are finished serializing.
- ASSERT(!m_dataBuffer.length());
- m_client->didSerializeDataForFrame(KURL(),
- WebCString("", 0),
- WebPageSerializerClient::AllFramesAreFinished);
+ ASSERT(m_dataBuffer.isEmpty());
+ m_client->didSerializeDataForFrame(KURL(), WebCString("", 0), WebPageSerializerClient::AllFramesAreFinished);
return didSerialization;
}
diff --git a/WebKit/chromium/src/WebPageSerializerImpl.h b/WebKit/chromium/src/WebPageSerializerImpl.h
index 8f6a99f..5ee8805 100644
--- a/WebKit/chromium/src/WebPageSerializerImpl.h
+++ b/WebKit/chromium/src/WebPageSerializerImpl.h
@@ -31,11 +31,12 @@
#ifndef WebPageSerializerImpl_h
#define WebPageSerializerImpl_h
-#include "PlatformString.h"
-#include "StringBuilder.h"
-#include "StringHash.h"
+#include <wtf/Forward.h>
#include <wtf/HashMap.h>
#include <wtf/Vector.h>
+#include <wtf/text/StringBuilder.h>
+#include <wtf/text/StringHash.h>
+#include <wtf/text/WTFString.h>
#include "WebEntities.h"
#include "WebPageSerializer.h"
@@ -47,7 +48,6 @@ namespace WebCore {
class Document;
class Element;
class Node;
-class String;
class TextEncoding;
}
@@ -93,12 +93,12 @@ private:
WebPageSerializerClient* m_client;
// This hash map is used to map resource URL of original link to its local
// file path.
- typedef HashMap<WebCore::String, WebCore::String> LinkLocalPathMap;
+ typedef HashMap<WTF::String, WTF::String> LinkLocalPathMap;
// local_links_ include all pair of local resource path and corresponding
// original link.
LinkLocalPathMap m_localLinks;
// Data buffer for saving result of serialized DOM data.
- WebCore::StringBuilder m_dataBuffer;
+ StringBuilder m_dataBuffer;
// Passing true to recursive_serialization_ indicates we will serialize not
// only the specified frame but also all sub-frames in the specific frame.
// Otherwise we only serialize the specified frame excluded all sub-frames.
@@ -107,7 +107,7 @@ private:
// serialized or not;
bool m_framesCollected;
// Local directory name of all local resource files.
- WebCore::String m_localDirectoryName;
+ WTF::String m_localDirectoryName;
// Vector for saving all frames which need to be serialized.
Vector<WebFrameImpl*> m_frames;
@@ -116,73 +116,63 @@ private:
WebEntities m_xmlEntities;
struct SerializeDomParam {
- // Frame URL of current processing document presented by GURL
- const WebCore::KURL& currentFrameURL;
- // Current using text encoding object.
+ const WebCore::KURL& url;
const WebCore::TextEncoding& textEncoding;
-
- // Document object of current frame.
- WebCore::Document* doc;
- // Local directory name of all local resource files.
- const WebCore::String& directoryName;
-
- // Flag indicates current doc is html document or not. It's a cache value
- // of Document.isHTMLDocument().
- bool isHTMLDocument;
- // Flag which indicate whether we have met document type declaration.
- bool hasDoctype;
- // Flag which indicate whether will process meta issue.
- bool hasCheckedMeta;
+ WebCore::Document* document;
+ const WTF::String& directoryName;
+ bool isHTMLDocument; // document.isHTMLDocument()
+ bool haveSeenDocType;
+ bool haveAddedCharsetDeclaration;
// This meta element need to be skipped when serializing DOM.
const WebCore::Element* skipMetaElement;
// Flag indicates we are in script or style tag.
bool isInScriptOrStyleTag;
- // Flag indicates whether we have written xml document declaration.
- // It is only used in xml document
- bool hasDocDeclaration;
+ bool haveAddedXMLProcessingDirective;
// Flag indicates whether we have added additional contents before end tag.
// This flag will be re-assigned in each call of function
// PostActionAfterSerializeOpenTag and it could be changed in function
// PreActionBeforeSerializeEndTag if the function adds new contents into
// serialization stream.
- bool hasAddedContentsBeforeEnd;
+ bool haveAddedContentsBeforeEnd;
- // Constructor.
- SerializeDomParam(const WebCore::KURL& currentFrameURL,
- const WebCore::TextEncoding& textEncoding,
- WebCore::Document* doc,
- const WebCore::String& directoryName);
+ SerializeDomParam(const WebCore::KURL&, const WebCore::TextEncoding&, WebCore::Document*, const WTF::String& directoryName);
};
// Collect all target frames which need to be serialized.
void collectTargetFrames();
// Before we begin serializing open tag of a element, we give the target
// element a chance to do some work prior to add some additional data.
- WebCore::String preActionBeforeSerializeOpenTag(const WebCore::Element* element,
+ WTF::String preActionBeforeSerializeOpenTag(const WebCore::Element* element,
SerializeDomParam* param,
bool* needSkip);
// After we finish serializing open tag of a element, we give the target
// element a chance to do some post work to add some additional data.
- WebCore::String postActionAfterSerializeOpenTag(const WebCore::Element* element,
+ WTF::String postActionAfterSerializeOpenTag(const WebCore::Element* element,
SerializeDomParam* param);
// Before we begin serializing end tag of a element, we give the target
// element a chance to do some work prior to add some additional data.
- WebCore::String preActionBeforeSerializeEndTag(const WebCore::Element* element,
+ WTF::String preActionBeforeSerializeEndTag(const WebCore::Element* element,
SerializeDomParam* param,
bool* needSkip);
// After we finish serializing end tag of a element, we give the target
// element a chance to do some post work to add some additional data.
- WebCore::String postActionAfterSerializeEndTag(const WebCore::Element* element,
+ WTF::String postActionAfterSerializeEndTag(const WebCore::Element* element,
SerializeDomParam* param);
// Save generated html content to data buffer.
- void saveHTMLContentToBuffer(const WebCore::String& content,
+ void saveHTMLContentToBuffer(const WTF::String& content,
SerializeDomParam* param);
+
+ enum FlushOption {
+ ForceFlush,
+ DoNotForceFlush,
+ };
+
// Flushes the content buffer by encoding and sending the content to the
// WebPageSerializerClient. Content is not flushed if the buffer is not full
// unless force is 1.
void encodeAndFlushBuffer(WebPageSerializerClient::PageSerializationStatus status,
SerializeDomParam* param,
- bool force);
+ FlushOption);
// Serialize open tag of an specified element.
void openTagToString(const WebCore::Element* element,
SerializeDomParam* param);
diff --git a/WebKit/chromium/src/WebPasswordFormData.cpp b/WebKit/chromium/src/WebPasswordFormData.cpp
index 64b1754..eb230d5 100644
--- a/WebKit/chromium/src/WebPasswordFormData.cpp
+++ b/WebKit/chromium/src/WebPasswordFormData.cpp
@@ -162,7 +162,10 @@ WebPasswordFormData::WebPasswordFormData(const WebFormElement& webForm)
KURL fullOrigin(ParsedURLString, form->document()->documentURI());
// Calculate the canonical action URL
- KURL fullAction = frame->loader()->completeURL(form->action());
+ String action = form->action();
+ if (action.isNull())
+ action = ""; // missing 'action' attribute implies current URL
+ KURL fullAction = frame->loader()->completeURL(action);
if (!fullAction.isValid())
return;
diff --git a/WebKit/chromium/src/WebPasswordFormUtils.cpp b/WebKit/chromium/src/WebPasswordFormUtils.cpp
index 766dc63..b4997e5 100644
--- a/WebKit/chromium/src/WebPasswordFormUtils.cpp
+++ b/WebKit/chromium/src/WebPasswordFormUtils.cpp
@@ -65,7 +65,7 @@ void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields)
int firstPasswordIndex = 0;
// First, find the password fields and activated submit button
- const Vector<HTMLFormControlElement*>& formElements = form->formElements;
+ const Vector<HTMLFormControlElement*>& formElements = form->associatedElements();
for (size_t i = 0; i < formElements.size(); i++) {
HTMLFormControlElement* formElement = formElements[i];
if (formElement->isActivatedSubmit())
@@ -79,8 +79,8 @@ void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields)
continue;
if ((fields->passwords.size() < maxPasswords)
- && (inputElement->inputType() == HTMLInputElement::PASSWORD)
- && (inputElement->autoComplete())) {
+ && inputElement->isPasswordField()
+ && inputElement->autoComplete()) {
if (fields->passwords.isEmpty())
firstPasswordIndex = i;
fields->passwords.append(inputElement);
@@ -98,7 +98,8 @@ void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields)
if (!inputElement->isEnabledFormControl())
continue;
- if ((inputElement->inputType() == HTMLInputElement::TEXT)
+ // Various input types such as text, url, email can be a username field.
+ if ((inputElement->isTextField() && !inputElement->isPasswordField())
&& (inputElement->autoComplete())) {
fields->userName = inputElement;
break;
diff --git a/WebKit/chromium/src/WebPerformance.cpp b/WebKit/chromium/src/WebPerformance.cpp
new file mode 100644
index 0000000..de9c1f6
--- /dev/null
+++ b/WebKit/chromium/src/WebPerformance.cpp
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebPerformance.h"
+
+#include "Performance.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+static double millisecondsToSeconds(unsigned long long milliseconds)
+{
+ return static_cast<double>(milliseconds / 1000.0);
+}
+
+void WebPerformance::reset()
+{
+ m_private.reset();
+}
+
+void WebPerformance::assign(const WebPerformance& other)
+{
+ m_private = other.m_private;
+}
+
+WebNavigationType WebPerformance::navigationType() const
+{
+ switch (m_private->navigation()->type()) {
+ case PerformanceNavigation::NAVIGATE:
+ return WebNavigationTypeOther;
+ case PerformanceNavigation::RELOAD:
+ return WebNavigationTypeReload;
+ case PerformanceNavigation::BACK_FORWARD:
+ return WebNavigationTypeBackForward;
+ }
+ ASSERT_NOT_REACHED();
+ return WebNavigationTypeOther;
+}
+
+double WebPerformance::navigationStart() const
+{
+ return millisecondsToSeconds(m_private->timing()->navigationStart());
+}
+
+double WebPerformance::unloadEventEnd() const
+{
+ return millisecondsToSeconds(m_private->timing()->unloadEventEnd());
+}
+
+double WebPerformance::redirectStart() const
+{
+ return millisecondsToSeconds(m_private->timing()->redirectStart());
+}
+
+double WebPerformance::redirectEnd() const
+{
+ return millisecondsToSeconds(m_private->timing()->redirectEnd());
+}
+
+unsigned short WebPerformance::redirectCount() const
+{
+ return m_private->navigation()->redirectCount();
+}
+
+double WebPerformance::fetchStart() const
+{
+ return millisecondsToSeconds(m_private->timing()->fetchStart());
+}
+
+double WebPerformance::domainLookupStart() const
+{
+ return millisecondsToSeconds(m_private->timing()->domainLookupStart());
+}
+
+double WebPerformance::domainLookupEnd() const
+{
+ return millisecondsToSeconds(m_private->timing()->domainLookupEnd());
+}
+
+double WebPerformance::connectStart() const
+{
+ return millisecondsToSeconds(m_private->timing()->connectStart());
+}
+
+double WebPerformance::connectEnd() const
+{
+ return millisecondsToSeconds(m_private->timing()->connectEnd());
+}
+
+double WebPerformance::requestStart() const
+{
+ return millisecondsToSeconds(m_private->timing()->requestStart());
+}
+
+double WebPerformance::responseStart() const
+{
+ return millisecondsToSeconds(m_private->timing()->responseStart());
+}
+
+double WebPerformance::responseEnd() const
+{
+ return millisecondsToSeconds(m_private->timing()->responseEnd());
+}
+
+double WebPerformance::loadEventStart() const
+{
+ return millisecondsToSeconds(m_private->timing()->loadEventStart());
+}
+
+double WebPerformance::loadEventEnd() const
+{
+ return millisecondsToSeconds(m_private->timing()->loadEventEnd());
+}
+
+WebPerformance::WebPerformance(const PassRefPtr<Performance>& performance)
+ : m_private(performance)
+{
+}
+
+WebPerformance& WebPerformance::operator=(const PassRefPtr<Performance>& performance)
+{
+ m_private = performance;
+ return *this;
+}
+
+WebPerformance::operator PassRefPtr<Performance>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebPluginContainerImpl.cpp b/WebKit/chromium/src/WebPluginContainerImpl.cpp
index 86cac26..43d9757 100644
--- a/WebKit/chromium/src/WebPluginContainerImpl.cpp
+++ b/WebKit/chromium/src/WebPluginContainerImpl.cpp
@@ -33,16 +33,23 @@
#include "Chrome.h"
#include "ChromeClientImpl.h"
+#include "PluginLayerChromium.h"
+#include "WebClipboard.h"
#include "WebCursorInfo.h"
#include "WebDataSourceImpl.h"
+#include "WebElement.h"
#include "WebInputEvent.h"
#include "WebInputEventConversion.h"
#include "WebKit.h"
+#include "WebKitClient.h"
#include "WebPlugin.h"
#include "WebRect.h"
+#include "WebString.h"
+#include "WebURL.h"
#include "WebURLError.h"
#include "WebURLRequest.h"
#include "WebVector.h"
+#include "WebViewImpl.h"
#include "WrappedResourceResponse.h"
#include "EventNames.h"
@@ -56,10 +63,13 @@
#include "HTMLFormElement.h"
#include "HTMLNames.h"
#include "HTMLPlugInElement.h"
+#include "KeyboardCodes.h"
#include "KeyboardEvent.h"
#include "MouseEvent.h"
#include "Page.h"
+#include "RenderBox.h"
#include "ScrollView.h"
+#include "WheelEvent.h"
#if WEBKIT_USING_SKIA
#include "PlatformContextSkia.h"
@@ -124,13 +134,13 @@ void WebPluginContainerImpl::invalidateRect(const IntRect& rect)
IntRect clipRect = parent()->windowClipRect();
damageRect.intersect(clipRect);
- parent()->hostWindow()->repaint(damageRect, true);
+ parent()->hostWindow()->invalidateContentsAndWindow(damageRect, false /*immediate*/);
}
-void WebPluginContainerImpl::setFocus()
+void WebPluginContainerImpl::setFocus(bool focused)
{
- Widget::setFocus();
- m_webPlugin->updateFocus(true);
+ Widget::setFocus(focused);
+ m_webPlugin->updateFocus(focused);
}
void WebPluginContainerImpl::show()
@@ -160,8 +170,15 @@ void WebPluginContainerImpl::handleEvent(Event* event)
// where mozilla behaves differently than the spec.
if (event->isMouseEvent())
handleMouseEvent(static_cast<MouseEvent*>(event));
+ else if (event->isWheelEvent())
+ handleWheelEvent(static_cast<WheelEvent*>(event));
else if (event->isKeyboardEvent())
handleKeyboardEvent(static_cast<KeyboardEvent*>(event));
+
+ // FIXME: it would be cleaner if Widget::handleEvent returned true/false and
+ // HTMLPluginElement called setDefaultHandled or defaultEventHandler.
+ if (!event->defaultHandled())
+ m_element->Node::defaultEventHandler(event);
}
void WebPluginContainerImpl::frameRectsChanged()
@@ -170,6 +187,12 @@ void WebPluginContainerImpl::frameRectsChanged()
reportGeometry();
}
+void WebPluginContainerImpl::widgetPositionsUpdated()
+{
+ Widget::widgetPositionsUpdated();
+ reportGeometry();
+}
+
void WebPluginContainerImpl::setParentVisible(bool parentVisible)
{
// We override this function to make sure that geometry updates are sent
@@ -200,6 +223,49 @@ void WebPluginContainerImpl::setParent(ScrollView* view)
reportGeometry();
}
+bool WebPluginContainerImpl::supportsPaginatedPrint() const
+{
+ return m_webPlugin->supportsPaginatedPrint();
+}
+
+int WebPluginContainerImpl::printBegin(const IntRect& printableArea,
+ int printerDPI) const
+{
+ return m_webPlugin->printBegin(printableArea, printerDPI);
+}
+
+bool WebPluginContainerImpl::printPage(int pageNumber,
+ WebCore::GraphicsContext* gc)
+{
+ gc->save();
+#if WEBKIT_USING_SKIA
+ WebCanvas* canvas = gc->platformContext()->canvas();
+#elif WEBKIT_USING_CG
+ WebCanvas* canvas = gc->platformContext();
+#endif
+ bool ret = m_webPlugin->printPage(pageNumber, canvas);
+ gc->restore();
+ return ret;
+}
+
+void WebPluginContainerImpl::printEnd()
+{
+ return m_webPlugin->printEnd();
+}
+
+void WebPluginContainerImpl::copy()
+{
+ if (!plugin()->hasSelection())
+ return;
+
+ webKitClient()->clipboard()->writeHTML(plugin()->selectionAsMarkup(), WebURL(), plugin()->selectionAsText(), false);
+}
+
+WebElement WebPluginContainerImpl::element()
+{
+ return WebElement(m_element);
+}
+
void WebPluginContainerImpl::invalidate()
{
Widget::invalidate();
@@ -210,6 +276,25 @@ void WebPluginContainerImpl::invalidateRect(const WebRect& rect)
invalidateRect(static_cast<IntRect>(rect));
}
+void WebPluginContainerImpl::scrollRect(int dx, int dy, const WebRect& rect)
+{
+ Widget* parentWidget = parent();
+ if (parentWidget->isFrameView()) {
+ FrameView* parentFrameView = static_cast<FrameView*>(parentWidget);
+ if (!parentFrameView->isOverlapped()) {
+ IntRect damageRect = convertToContainingWindow(static_cast<IntRect>(rect));
+ IntSize scrollDelta(dx, dy);
+ // scroll() only uses the second rectangle, clipRect, and ignores the first
+ // rectangle.
+ parent()->hostWindow()->scroll(scrollDelta, damageRect, damageRect);
+ return;
+ }
+ }
+
+ // Use slow scrolling instead.
+ invalidateRect(rect);
+}
+
void WebPluginContainerImpl::reportGeometry()
{
if (!parent())
@@ -222,6 +307,14 @@ void WebPluginContainerImpl::reportGeometry()
m_webPlugin->updateGeometry(windowRect, clipRect, cutOutRects, isVisible());
}
+void WebPluginContainerImpl::commitBackingTexture()
+{
+#if USE(ACCELERATED_COMPOSITING)
+ if (platformLayer())
+ platformLayer()->setNeedsDisplay();
+#endif
+}
+
void WebPluginContainerImpl::clearScriptObjects()
{
Frame* frame = m_element->document()->frame();
@@ -284,6 +377,12 @@ void WebPluginContainerImpl::loadFrameRequest(
SendReferrer);
}
+void WebPluginContainerImpl::zoomLevelChanged(double zoomLevel)
+{
+ WebViewImpl* view = WebViewImpl::fromPage(m_element->document()->frame()->page());
+ view->fullFramePluginZoomLevelChanged(zoomLevel);
+}
+
void WebPluginContainerImpl::didReceiveResponse(const ResourceResponse& response)
{
// Make sure that the plugin receives window geometry before data, or else
@@ -322,8 +421,33 @@ void WebPluginContainerImpl::willDestroyPluginLoadObserver(WebPluginLoadObserver
m_pluginLoadObservers.remove(pos);
}
+#if USE(ACCELERATED_COMPOSITING)
+WebCore::LayerChromium* WebPluginContainerImpl::platformLayer() const
+{
+ // FIXME: In the event of a context lost, the texture needs to be recreated on the compositor's
+ // context and rebound to the platform layer here.
+ unsigned backingTextureId = m_webPlugin->getBackingTextureId();
+ if (!backingTextureId)
+ return 0;
+
+ m_platformLayer->setTextureId(backingTextureId);
+
+ return m_platformLayer.get();
+}
+#endif
+
// Private methods -------------------------------------------------------------
+WebPluginContainerImpl::WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin)
+ : WebCore::PluginViewBase(0)
+ , m_element(element)
+ , m_webPlugin(webPlugin)
+#if USE(ACCELERATED_COMPOSITING)
+ , m_platformLayer(PluginLayerChromium::create(0))
+#endif
+{
+}
+
WebPluginContainerImpl::~WebPluginContainerImpl()
{
for (size_t i = 0; i < m_pluginLoadObservers.size(); ++i)
@@ -339,7 +463,7 @@ void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event)
// in the call to HandleEvent. See http://b/issue?id=1362948
FrameView* parentView = static_cast<FrameView*>(parent());
- WebMouseEventBuilder webEvent(parentView, *event);
+ WebMouseEventBuilder webEvent(this, *event);
if (webEvent.type == WebInputEvent::Undefined)
return;
@@ -353,22 +477,7 @@ void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event)
}
WebCursorInfo cursorInfo;
- bool handled = m_webPlugin->handleInputEvent(webEvent, cursorInfo);
-#if !OS(DARWIN)
- // TODO(pkasting): http://b/1119691 This conditional seems exactly
- // backwards, but if I reverse it, giving focus to a transparent
- // (windowless) plugin fails.
- handled = !handled;
- // TODO(awalker): oddly, the above is not true in Mac builds. Looking
- // at Apple's corresponding code for Mac and Windows (PluginViewMac and
- // PluginViewWin), setDefaultHandled() gets called when handleInputEvent()
- // returns true, which then indicates to WebCore that the plugin wants to
- // swallow the event--which is what we want. Calling setDefaultHandled()
- // fixes several Mac Chromium bugs, but does indeed prevent windowless plugins
- // from getting focus in Windows builds, as pkasting notes above. So for
- // now, we only do so in Mac builds.
-#endif
- if (handled)
+ if (m_webPlugin->handleInputEvent(webEvent, cursorInfo))
event->setDefaultHandled();
// A windowless plugin can change the cursor in response to a mouse move
@@ -382,19 +491,48 @@ void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event)
chromeClient->setCursorForPlugin(cursorInfo);
}
+void WebPluginContainerImpl::handleWheelEvent(WheelEvent* event)
+{
+ WebMouseWheelEventBuilder webEvent(this, *event);
+ if (webEvent.type == WebInputEvent::Undefined)
+ return;
+
+ WebCursorInfo cursorInfo;
+ if (m_webPlugin->handleInputEvent(webEvent, cursorInfo))
+ event->setDefaultHandled();
+}
+
void WebPluginContainerImpl::handleKeyboardEvent(KeyboardEvent* event)
{
WebKeyboardEventBuilder webEvent(*event);
if (webEvent.type == WebInputEvent::Undefined)
return;
- WebCursorInfo cursor_info;
- bool handled = m_webPlugin->handleInputEvent(webEvent, cursor_info);
-#if !OS(DARWIN)
- // TODO(pkasting): http://b/1119691 See above.
- handled = !handled;
+ if (webEvent.type == WebInputEvent::KeyDown) {
+#if defined(OS_MACOSX)
+ if (webEvent.modifiers == WebInputEvent::MetaKey
+#else
+ if (webEvent.modifiers == WebInputEvent::ControlKey
#endif
- if (handled)
+ && webEvent.windowsKeyCode == VKEY_C) {
+ copy();
+ event->setDefaultHandled();
+ return;
+ }
+ }
+
+ const WebInputEvent* currentInputEvent = WebViewImpl::currentInputEvent();
+
+ // Copy stashed info over, and only copy here in order not to interfere
+ // the ctrl-c logic above.
+ if (currentInputEvent
+ && WebInputEvent::isKeyboardEventType(currentInputEvent->type)) {
+ webEvent.modifiers |= currentInputEvent->modifiers &
+ (WebInputEvent::CapsLockOn | WebInputEvent::NumLockOn);
+ }
+
+ WebCursorInfo cursorInfo;
+ if (m_webPlugin->handleInputEvent(webEvent, cursorInfo))
event->setDefaultHandled();
}
@@ -473,11 +611,20 @@ static bool checkStackOnTop(
return false;
}
- // For compatibility with IE: when the plugin is not positioned,
- // it stacks behind the iframe, even if it's later in the
- // document order.
- if (ro2->style()->position() == StaticPosition)
+ // If the plugin does not have an explicit z-index it stacks behind the iframe.
+ // This is for maintaining compatibility with IE.
+ if (ro2->style()->position() == StaticPosition) {
+ // The 0'th elements of these RenderObject arrays represent the plugin node and
+ // the iframe.
+ const RenderObject* pluginRenderObject = pluginZstack[0];
+ const RenderObject* iframeRenderObject = iframeZstack[0];
+
+ if (pluginRenderObject->style() && iframeRenderObject->style()) {
+ if (pluginRenderObject->style()->zIndex() > iframeRenderObject->style()->zIndex())
+ return false;
+ }
return true;
+ }
// Inspect the document order. Later order means higher
// stacking.
diff --git a/WebKit/chromium/src/WebPluginContainerImpl.h b/WebKit/chromium/src/WebPluginContainerImpl.h
index 00450bb..ebe6983 100644
--- a/WebKit/chromium/src/WebPluginContainerImpl.h
+++ b/WebKit/chromium/src/WebPluginContainerImpl.h
@@ -31,11 +31,10 @@
#ifndef WebPluginContainerImpl_h
#define WebPluginContainerImpl_h
-// FIXME: This relative path is a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebPluginContainer.h"
-
+#include "PluginViewBase.h"
+#include "WebPluginContainer.h"
#include "Widget.h"
+
#include <wtf/PassRefPtr.h>
#include <wtf/Vector.h>
@@ -45,9 +44,12 @@ namespace WebCore {
class HTMLPlugInElement;
class IntRect;
class KeyboardEvent;
+class LayerChromium;
class MouseEvent;
+class PluginLayerChromium;
class ResourceError;
class ResourceResponse;
+class WheelEvent;
}
namespace WebKit {
@@ -55,7 +57,7 @@ namespace WebKit {
class WebPlugin;
class WebPluginLoadObserver;
-class WebPluginContainerImpl : public WebCore::Widget, public WebPluginContainer {
+class WebPluginContainerImpl : public WebCore::PluginViewBase, public WebPluginContainer {
public:
static PassRefPtr<WebPluginContainerImpl> create(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin)
{
@@ -66,22 +68,49 @@ public:
virtual void setFrameRect(const WebCore::IntRect&);
virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&);
virtual void invalidateRect(const WebCore::IntRect&);
- virtual void setFocus();
+ virtual void setFocus(bool);
virtual void show();
virtual void hide();
virtual void handleEvent(WebCore::Event*);
virtual void frameRectsChanged();
virtual void setParentVisible(bool);
virtual void setParent(WebCore::ScrollView*);
+ virtual void widgetPositionsUpdated();
+ virtual bool isPluginContainer() const { return true; }
// WebPluginContainer methods
+ virtual WebElement element();
virtual void invalidate();
virtual void invalidateRect(const WebRect&);
+ virtual void scrollRect(int dx, int dy, const WebRect&);
virtual void reportGeometry();
+ virtual void commitBackingTexture();
virtual void clearScriptObjects();
virtual NPObject* scriptableObjectForElement();
virtual WebString executeScriptURL(const WebURL&, bool popupsAllowed);
virtual void loadFrameRequest(const WebURLRequest&, const WebString& target, bool notifyNeeded, void* notifyData);
+ virtual void zoomLevelChanged(double zoomLevel);
+
+ // This cannot be null.
+ WebPlugin* plugin() { return m_webPlugin; }
+ void setPlugin(WebPlugin* plugin) { m_webPlugin = plugin; }
+
+ // Printing interface. The plugin can support custom printing
+ // (which means it controls the layout, number of pages etc).
+ // Whether the plugin supports its own paginated print. The other print
+ // interface methods are called only if this method returns true.
+ bool supportsPaginatedPrint() const;
+ // Sets up printing at the given print rect and printer DPI. printableArea
+ // is in points (a point is 1/72 of an inch).Returns the number of pages to
+ // be printed at these settings.
+ int printBegin(const WebCore::IntRect& printableArea, int printerDPI) const;
+ // Prints the page specified by pageNumber (0-based index) into the supplied canvas.
+ bool printPage(int pageNumber, WebCore::GraphicsContext* gc);
+ // Ends the print operation.
+ void printEnd();
+
+ // Copy the selected text.
+ void copy();
// Resource load events for the plugin's source data:
void didReceiveResponse(const WebCore::ResourceResponse&);
@@ -91,18 +120,18 @@ public:
NPObject* scriptableObject();
- // This cannot be null.
- WebPlugin* plugin() { return m_webPlugin; }
-
void willDestroyPluginLoadObserver(WebPluginLoadObserver*);
+#if USE(ACCELERATED_COMPOSITING)
+ virtual WebCore::LayerChromium* platformLayer() const;
+#endif
+
private:
- WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin)
- : m_element(element)
- , m_webPlugin(webPlugin) { }
+ WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin);
~WebPluginContainerImpl();
void handleMouseEvent(WebCore::MouseEvent*);
+ void handleWheelEvent(WebCore::WheelEvent*);
void handleKeyboardEvent(WebCore::KeyboardEvent*);
void calculateGeometry(const WebCore::IntRect& frameRect,
@@ -116,6 +145,10 @@ private:
WebCore::HTMLPlugInElement* m_element;
WebPlugin* m_webPlugin;
Vector<WebPluginLoadObserver*> m_pluginLoadObservers;
+
+#if USE(ACCELERATED_COMPOSITING)
+ RefPtr<WebCore::PluginLayerChromium> m_platformLayer;
+#endif
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebPluginDocument.cpp b/WebKit/chromium/src/WebPluginDocument.cpp
new file mode 100644
index 0000000..8f794ad
--- /dev/null
+++ b/WebKit/chromium/src/WebPluginDocument.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebPluginDocument.h"
+
+#include "Document.h"
+#include "PluginDocument.h"
+
+#include "WebPluginContainerImpl.h"
+
+#include <wtf/PassRefPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+
+WebPlugin* WebPluginDocument::plugin()
+{
+ if (!isPluginDocument())
+ return 0;
+ PluginDocument* doc = unwrap<PluginDocument>();
+ WebPluginContainerImpl* container = static_cast<WebPluginContainerImpl*>(static_cast<PluginDocument*>(doc)->pluginWidget());
+ return container->plugin();
+}
+
+
+WebPluginDocument::WebPluginDocument(const PassRefPtr<PluginDocument>& elem)
+ : WebDocument(elem)
+{
+}
+
+WebPluginDocument& WebPluginDocument::operator=(const PassRefPtr<PluginDocument>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebPluginDocument::operator PassRefPtr<PluginDocument>() const
+{
+ return static_cast<PluginDocument*>(m_private.get());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebPluginListBuilderImpl.cpp b/WebKit/chromium/src/WebPluginListBuilderImpl.cpp
index 6926a2d..d0f7324 100644
--- a/WebKit/chromium/src/WebPluginListBuilderImpl.cpp
+++ b/WebKit/chromium/src/WebPluginListBuilderImpl.cpp
@@ -41,27 +41,25 @@ namespace WebKit {
void WebPluginListBuilderImpl::addPlugin(const WebString& name, const WebString& description, const WebString& fileName)
{
- PluginInfo* info = new PluginInfo();
- info->name = name;
- info->desc = description;
- info->file = fileName;
+ PluginInfo info;
+ info.name = name;
+ info.desc = description;
+ info.file = fileName;
m_results->append(info);
}
void WebPluginListBuilderImpl::addMediaTypeToLastPlugin(const WebString& name, const WebString& description)
{
- MimeClassInfo* info = new MimeClassInfo();
- info->type = name;
- info->desc = description;
- m_results->last()->mimes.append(info);
+ MimeClassInfo info;
+ info.type = name;
+ info.desc = description;
+ m_results->last().mimes.append(info);
}
void WebPluginListBuilderImpl::addFileExtensionToLastMediaType(const WebString& extension)
{
- MimeClassInfo* info = m_results->last()->mimes.last();
- if (!info->suffixes.isEmpty())
- info->suffixes.append(',');
- info->suffixes.append(extension);
+ MimeClassInfo& info = m_results->last().mimes.last();
+ info.extensions.append(extension);
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebPluginListBuilderImpl.h b/WebKit/chromium/src/WebPluginListBuilderImpl.h
index 7a8a497..3d7977a 100644
--- a/WebKit/chromium/src/WebPluginListBuilderImpl.h
+++ b/WebKit/chromium/src/WebPluginListBuilderImpl.h
@@ -40,7 +40,7 @@ namespace WebKit {
class WebPluginListBuilderImpl : public WebPluginListBuilder {
public:
- WebPluginListBuilderImpl(Vector<WebCore::PluginInfo*>* results) : m_results(results) { }
+ WebPluginListBuilderImpl(Vector<WebCore::PluginInfo>* results) : m_results(results) { }
// WebPluginListBuilder methods:
virtual void addPlugin(const WebString& name, const WebString& description, const WebString& fileName);
@@ -48,7 +48,7 @@ public:
virtual void addFileExtensionToLastMediaType(const WebString& extension);
private:
- Vector<WebCore::PluginInfo*>* m_results;
+ Vector<WebCore::PluginInfo>* m_results;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebPluginLoadObserver.h b/WebKit/chromium/src/WebPluginLoadObserver.h
index 097d08d..7bd06eb 100644
--- a/WebKit/chromium/src/WebPluginLoadObserver.h
+++ b/WebKit/chromium/src/WebPluginLoadObserver.h
@@ -31,7 +31,7 @@
#ifndef WebPluginLoadObserver_h
#define WebPluginLoadObserver_h
-#include "../public/WebURL.h"
+#include "WebURL.h"
namespace WebKit {
diff --git a/WebKit/chromium/src/WebPopupMenuImpl.cpp b/WebKit/chromium/src/WebPopupMenuImpl.cpp
index f6d360e..085a157 100644
--- a/WebKit/chromium/src/WebPopupMenuImpl.cpp
+++ b/WebKit/chromium/src/WebPopupMenuImpl.cpp
@@ -56,7 +56,8 @@ namespace WebKit {
WebPopupMenu* WebPopupMenu::create(WebWidgetClient* client)
{
- return new WebPopupMenuImpl(client);
+ // Pass the WebPopupMenuImpl's self-reference to the caller.
+ return adoptRef(new WebPopupMenuImpl(client)).leakRef();
}
// WebWidget ------------------------------------------------------------------
@@ -173,6 +174,16 @@ void WebPopupMenuImpl::paint(WebCanvas* canvas, const WebRect& rect)
}
}
+void WebPopupMenuImpl::themeChanged()
+{
+ notImplemented();
+}
+
+void WebPopupMenuImpl::composite(bool finish)
+{
+ notImplemented();
+}
+
bool WebPopupMenuImpl::handleInputEvent(const WebInputEvent& inputEvent)
{
if (!m_widget)
@@ -230,18 +241,28 @@ void WebPopupMenuImpl::setFocus(bool enable)
{
}
-bool WebPopupMenuImpl::handleCompositionEvent(
- WebCompositionCommand command, int cursorPosition, int targetStart,
- int targetEnd, const WebString& imeString)
+bool WebPopupMenuImpl::setComposition(
+ const WebString& text, const WebVector<WebCompositionUnderline>& underlines,
+ int selectionStart, int selectionEnd)
{
return false;
}
-bool WebPopupMenuImpl::queryCompositionStatus(bool* enabled, WebRect* caretRect)
+bool WebPopupMenuImpl::confirmComposition()
{
return false;
}
+WebTextInputType WebPopupMenuImpl::textInputType()
+{
+ return WebTextInputTypeNone;
+}
+
+WebRect WebPopupMenuImpl::caretOrSelectionBounds()
+{
+ return WebRect();
+}
+
void WebPopupMenuImpl::setTextDirection(WebTextDirection direction)
{
}
@@ -250,18 +271,29 @@ void WebPopupMenuImpl::setTextDirection(WebTextDirection direction)
//-----------------------------------------------------------------------------
// WebCore::HostWindow
-void WebPopupMenuImpl::repaint(const IntRect& paintRect,
- bool contentChanged,
- bool immediate,
- bool repaintContentOnly)
+void WebPopupMenuImpl::invalidateContents(const IntRect&, bool)
{
- // Ignore spurious calls.
- if (!contentChanged || paintRect.isEmpty())
+ notImplemented();
+}
+
+void WebPopupMenuImpl::invalidateWindow(const IntRect&, bool)
+{
+ notImplemented();
+}
+
+void WebPopupMenuImpl::invalidateContentsAndWindow(const IntRect& paintRect, bool /*immediate*/)
+{
+ if (paintRect.isEmpty())
return;
if (m_client)
m_client->didInvalidateRect(paintRect);
}
+void WebPopupMenuImpl::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate)
+{
+ invalidateContentsAndWindow(updateRect, immediate);
+}
+
void WebPopupMenuImpl::scroll(const IntSize& scrollDelta,
const IntRect& scrollRect,
const IntRect& clipRect)
@@ -296,6 +328,10 @@ void WebPopupMenuImpl::scrollbarsModeDidChange() const
// Nothing to be done since we have no concept of different scrollbar modes.
}
+void WebPopupMenuImpl::setCursor(const WebCore::Cursor&)
+{
+}
+
//-----------------------------------------------------------------------------
// WebCore::FramelessScrollViewClient
diff --git a/WebKit/chromium/src/WebPopupMenuImpl.h b/WebKit/chromium/src/WebPopupMenuImpl.h
index 13eb674..221ba03 100644
--- a/WebKit/chromium/src/WebPopupMenuImpl.h
+++ b/WebKit/chromium/src/WebPopupMenuImpl.h
@@ -31,14 +31,10 @@
#ifndef WebPopupMenuImpl_h
#define WebPopupMenuImpl_h
-// FIXME: Add this to FramelessScrollViewClient.h
-namespace WebCore { class FramelessScrollView; }
-
#include "FramelessScrollViewClient.h"
-// FIXME: remove the relative paths once glue/ consumers are removed.
-#include "../public/WebPoint.h"
-#include "../public/WebPopupMenu.h"
-#include "../public/WebSize.h"
+#include "WebPoint.h"
+#include "WebPopupMenu.h"
+#include "WebSize.h"
#include <wtf/RefCounted.h>
namespace WebCore {
@@ -67,14 +63,20 @@ public:
virtual void resize(const WebSize&);
virtual void layout();
virtual void paint(WebCanvas* canvas, const WebRect& rect);
+ virtual void themeChanged();
+ virtual void composite(bool finish);
virtual bool handleInputEvent(const WebInputEvent&);
virtual void mouseCaptureLost();
virtual void setFocus(bool enable);
- virtual bool handleCompositionEvent(
- WebCompositionCommand command, int cursorPosition,
- int targetStart, int targetEnd, const WebString& text);
- virtual bool queryCompositionStatus(bool* enabled, WebRect* caretRect);
+ virtual bool setComposition(
+ const WebString& text,
+ const WebVector<WebCompositionUnderline>& underlines,
+ int selectionStart, int selectionEnd);
+ virtual bool confirmComposition();
+ virtual WebTextInputType textInputType();
+ virtual WebRect caretOrSelectionBounds();
virtual void setTextDirection(WebTextDirection direction);
+ virtual bool isAcceleratedCompositingActive() const { return false; }
// WebPopupMenuImpl
void Init(WebCore::FramelessScrollView* widget,
@@ -98,9 +100,10 @@ public:
~WebPopupMenuImpl();
// WebCore::HostWindow methods:
- virtual void repaint(
- const WebCore::IntRect&, bool contentChanged, bool immediate = false,
- bool repaintContentOnly = false);
+ virtual void invalidateContents(const WebCore::IntRect&, bool);
+ virtual void invalidateWindow(const WebCore::IntRect&, bool);
+ virtual void invalidateContentsAndWindow(const WebCore::IntRect&, bool);
+ virtual void invalidateContentsForSlowScroll(const WebCore::IntRect&, bool);
virtual void scroll(
const WebCore::IntSize& scrollDelta, const WebCore::IntRect& scrollRect,
const WebCore::IntRect& clipRect);
@@ -109,6 +112,7 @@ public:
virtual PlatformPageClient platformPageClient() const { return 0; }
virtual void scrollRectIntoView(const WebCore::IntRect&, const WebCore::ScrollView*) const;
virtual void scrollbarsModeDidChange() const;
+ virtual void setCursor(const WebCore::Cursor&);
// WebCore::FramelessScrollViewClient methods:
virtual void popupClosed(WebCore::FramelessScrollView*);
diff --git a/WebKit/chromium/src/WebRuntimeFeatures.cpp b/WebKit/chromium/src/WebRuntimeFeatures.cpp
index ad84764..edb0413 100644
--- a/WebKit/chromium/src/WebRuntimeFeatures.cpp
+++ b/WebKit/chromium/src/WebRuntimeFeatures.cpp
@@ -31,7 +31,7 @@
#include "config.h"
#include "WebRuntimeFeatures.h"
-#include "Database.h"
+#include "AbstractDatabase.h"
#include "RuntimeEnabledFeatures.h"
#include "WebMediaPlayerClientImpl.h"
#include "WebSocket.h"
@@ -43,14 +43,14 @@ namespace WebKit {
void WebRuntimeFeatures::enableDatabase(bool enable)
{
#if ENABLE(DATABASE)
- Database::setIsAvailable(enable);
+ AbstractDatabase::setIsAvailable(enable);
#endif
}
bool WebRuntimeFeatures::isDatabaseEnabled()
{
#if ENABLE(DATABASE)
- return Database::isAvailable();
+ return AbstractDatabase::isAvailable();
#else
return false;
#endif
@@ -171,14 +171,118 @@ bool WebRuntimeFeatures::isGeolocationEnabled()
void WebRuntimeFeatures::enableIndexedDatabase(bool enable)
{
#if ENABLE(INDEXED_DATABASE)
- RuntimeEnabledFeatures::setIndexedDBEnabled(enable);
+ RuntimeEnabledFeatures::setWebkitIndexedDBEnabled(enable);
#endif
}
bool WebRuntimeFeatures::isIndexedDatabaseEnabled()
{
#if ENABLE(INDEXED_DATABASE)
- return RuntimeEnabledFeatures::indexedDBEnabled();
+ return RuntimeEnabledFeatures::webkitIndexedDBEnabled();
+#else
+ return false;
+#endif
+}
+
+void WebRuntimeFeatures::enableWebGL(bool enable)
+{
+#if ENABLE(3D_CANVAS)
+ RuntimeEnabledFeatures::setWebGLEnabled(enable);
+#endif
+}
+
+bool WebRuntimeFeatures::isWebGLEnabled()
+{
+#if ENABLE(3D_CANVAS)
+ return RuntimeEnabledFeatures::webGLRenderingContextEnabled();
+#else
+ return false;
+#endif
+}
+
+void WebRuntimeFeatures::enablePushState(bool enable)
+{
+ RuntimeEnabledFeatures::setPushStateEnabled(enable);
+}
+
+bool WebRuntimeFeatures::isPushStateEnabled(bool enable)
+{
+ return RuntimeEnabledFeatures::pushStateEnabled();
+}
+
+void WebRuntimeFeatures::enableTouch(bool enable)
+{
+#if ENABLE(TOUCH_EVENTS)
+ RuntimeEnabledFeatures::setTouchEnabled(enable);
+#endif
+}
+
+bool WebRuntimeFeatures::isTouchEnabled()
+{
+#if ENABLE(TOUCH_EVENTS)
+ return RuntimeEnabledFeatures::touchEnabled();
+#else
+ return false;
+#endif
+}
+
+void WebRuntimeFeatures::enableDeviceMotion(bool enable)
+{
+ RuntimeEnabledFeatures::setDeviceMotionEnabled(enable);
+}
+
+bool WebRuntimeFeatures::isDeviceMotionEnabled()
+{
+ return RuntimeEnabledFeatures::deviceMotionEnabled();
+}
+
+void WebRuntimeFeatures::enableDeviceOrientation(bool enable)
+{
+ RuntimeEnabledFeatures::setDeviceOrientationEnabled(enable);
+}
+
+bool WebRuntimeFeatures::isDeviceOrientationEnabled()
+{
+ return RuntimeEnabledFeatures::deviceOrientationEnabled();
+}
+
+void WebRuntimeFeatures::enableSpeechInput(bool enable)
+{
+ RuntimeEnabledFeatures::setSpeechInputEnabled(enable);
+}
+
+bool WebRuntimeFeatures::isSpeechInputEnabled()
+{
+ return RuntimeEnabledFeatures::speechInputEnabled();
+}
+
+void WebRuntimeFeatures::enableXHRResponseBlob(bool enable)
+{
+#if ENABLE(XHR_RESPONSE_BLOB)
+ RuntimeEnabledFeatures::setXHRResponseBlobEnabled(enable);
+#endif
+}
+
+bool WebRuntimeFeatures::isXHRResponseBlobEnabled()
+{
+#if ENABLE(XHR_RESPONSE_BLOB)
+ return RuntimeEnabledFeatures::xhrResponseBlobEnabled();
+#else
+ return false;
+#endif
+}
+
+void WebRuntimeFeatures::enableFileSystem(bool enable)
+{
+#if ENABLE(FILE_SYSTEM)
+ RuntimeEnabledFeatures::setFileSystemEnabled(enable);
+#endif
+}
+
+bool WebRuntimeFeatures::isFileSystemEnabled()
+{
+#if ENABLE(FILE_SYSTEM)
+ return RuntimeEnabledFeatures::fileSystemEnabled();
#else
return false;
#endif
diff --git a/WebKit/chromium/src/WebScriptController.cpp b/WebKit/chromium/src/WebScriptController.cpp
index d2c168d..0aa11a6 100644
--- a/WebKit/chromium/src/WebScriptController.cpp
+++ b/WebKit/chromium/src/WebScriptController.cpp
@@ -43,19 +43,7 @@ namespace WebKit {
void WebScriptController::registerExtension(v8::Extension* extension)
{
- V8Proxy::registerExtension(extension, WebString());
-}
-
-void WebScriptController::registerExtension(v8::Extension* extension,
- const WebString& schemeRestriction)
-{
- V8Proxy::registerExtension(extension, schemeRestriction);
-}
-
-void WebScriptController::registerExtension(v8::Extension* extension,
- int extensionGroup)
-{
- V8Proxy::registerExtension(extension, extensionGroup);
+ V8Proxy::registerExtension(extension);
}
void WebScriptController::enableV8SingleThreadMode()
diff --git a/WebKit/chromium/src/WebScrollbarImpl.cpp b/WebKit/chromium/src/WebScrollbarImpl.cpp
new file mode 100644
index 0000000..8b9e287
--- /dev/null
+++ b/WebKit/chromium/src/WebScrollbarImpl.cpp
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebScrollbarImpl.h"
+
+#include "GraphicsContext.h"
+#include "KeyboardCodes.h"
+#include "PlatformContextSkia.h"
+#include "Scrollbar.h"
+#include "ScrollbarTheme.h"
+#include "ScrollTypes.h"
+#include "WebCanvas.h"
+#include "WebInputEvent.h"
+#include "WebInputEventConversion.h"
+#include "WebRect.h"
+#include "WebScrollbarClient.h"
+#include "WebVector.h"
+#include "WebViewImpl.h"
+
+using namespace std;
+using namespace WebCore;
+
+namespace WebKit {
+
+WebScrollbar* WebScrollbar::create(WebScrollbarClient* client, Orientation orientation)
+{
+ return new WebScrollbarImpl(client, orientation);
+}
+
+int WebScrollbar::defaultThickness()
+{
+ return ScrollbarTheme::nativeTheme()->scrollbarThickness();
+}
+
+WebScrollbarImpl::WebScrollbarImpl(WebScrollbarClient* client, Orientation orientation)
+ : m_client(client)
+{
+ m_scrollbar = Scrollbar::createNativeScrollbar(
+ static_cast<ScrollbarClient*>(this),
+ static_cast<ScrollbarOrientation>(orientation),
+ RegularScrollbar);
+}
+
+WebScrollbarImpl::~WebScrollbarImpl()
+{
+}
+
+void WebScrollbarImpl::setLocation(const WebRect& rect)
+{
+ WebCore::IntRect oldRect = m_scrollbar->frameRect();
+ m_scrollbar->setFrameRect(rect);
+ if (WebRect(oldRect) != rect)
+ m_scrollbar->invalidate();
+
+ int length = m_scrollbar->orientation() == HorizontalScrollbar ? m_scrollbar->width() : m_scrollbar->height();
+ int pageStep = max(max(static_cast<int>(static_cast<float>(length) * Scrollbar::minFractionToStepWhenPaging()), length - Scrollbar::maxOverlapBetweenPages()), 1);
+ m_scrollbar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
+ m_scrollbar->setEnabled(m_scrollbar->totalSize() > length);
+ m_scrollbar->setProportion(length, m_scrollbar->totalSize());
+}
+
+int WebScrollbarImpl::value() const
+{
+ return m_scrollbar->value();
+}
+
+void WebScrollbarImpl::setValue(int position)
+{
+ m_scrollbar->setValue(position, Scrollbar::NotFromScrollAnimator);
+}
+
+void WebScrollbarImpl::setDocumentSize(int size)
+{
+ int length = m_scrollbar->orientation() == HorizontalScrollbar ? m_scrollbar->width() : m_scrollbar->height();
+ m_scrollbar->setEnabled(size > length);
+ m_scrollbar->setProportion(length, size);
+}
+
+void WebScrollbarImpl::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier)
+{
+ WebCore::ScrollDirection dir;
+ bool horizontal = m_scrollbar->orientation() == HorizontalScrollbar;
+ if (direction == ScrollForward)
+ dir = horizontal ? ScrollRight : ScrollDown;
+ else
+ dir = horizontal ? ScrollLeft : ScrollUp;
+ m_scrollbar->scroll(dir, static_cast<WebCore::ScrollGranularity>(granularity), multiplier);
+}
+
+void WebScrollbarImpl::paint(WebCanvas* canvas, const WebRect& rect)
+{
+#if WEBKIT_USING_CG
+ GraphicsContext gc(canvas);
+#elif WEBKIT_USING_SKIA
+ PlatformContextSkia context(canvas);
+
+ // PlatformGraphicsContext is actually a pointer to PlatformContextSkia
+ GraphicsContext gc(reinterpret_cast<PlatformGraphicsContext*>(&context));
+#else
+ notImplemented();
+#endif
+
+ m_scrollbar->paint(&gc, rect);
+}
+
+bool WebScrollbarImpl::handleInputEvent(const WebInputEvent& event)
+{
+ switch (event.type) {
+ case WebInputEvent::MouseDown:
+ return onMouseDown(event);
+ case WebInputEvent::MouseUp:
+ return onMouseUp(event);
+ case WebInputEvent::MouseMove:
+ return onMouseMove(event);
+ case WebInputEvent::MouseLeave:
+ return onMouseLeave(event);
+ case WebInputEvent::MouseWheel:
+ return onMouseWheel(event);
+ case WebInputEvent::KeyDown:
+ return onKeyDown(event);
+ case WebInputEvent::Undefined:
+ case WebInputEvent::MouseEnter:
+ case WebInputEvent::RawKeyDown:
+ case WebInputEvent::KeyUp:
+ case WebInputEvent::Char:
+ case WebInputEvent::TouchStart:
+ case WebInputEvent::TouchMove:
+ case WebInputEvent::TouchEnd:
+ case WebInputEvent::TouchCancel:
+ default:
+ break;
+ }
+ return false;
+}
+
+bool WebScrollbarImpl::onMouseDown(const WebInputEvent& event)
+{
+ WebMouseEvent mousedown = *static_cast<const WebMouseEvent*>(&event);
+ if (!m_scrollbar->frameRect().contains(mousedown.x, mousedown.y))
+ return false;
+
+ mousedown.x -= m_scrollbar->x();
+ mousedown.y -= m_scrollbar->y();
+ m_scrollbar->mouseDown(PlatformMouseEventBuilder(m_scrollbar.get(), mousedown));
+ return true;
+ }
+
+bool WebScrollbarImpl::onMouseUp(const WebInputEvent& event)
+{
+ if (m_scrollbar->pressedPart() == NoPart)
+ return false;
+
+ return m_scrollbar->mouseUp();
+}
+
+bool WebScrollbarImpl::onMouseMove(const WebInputEvent& event)
+{
+ WebMouseEvent mousemove = *static_cast<const WebMouseEvent*>(&event);
+ if (m_scrollbar->frameRect().contains(mousemove.x, mousemove.y)
+ || m_scrollbar->pressedPart() != NoPart) {
+ mousemove.x -= m_scrollbar->x();
+ mousemove.y -= m_scrollbar->y();
+ return m_scrollbar->mouseMoved(PlatformMouseEventBuilder(m_scrollbar.get(), mousemove));
+ }
+
+ if (m_scrollbar->hoveredPart() != NoPart)
+ m_scrollbar->mouseExited();
+ return false;
+}
+
+bool WebScrollbarImpl::onMouseLeave(const WebInputEvent& event)
+{
+ if (m_scrollbar->hoveredPart() == NoPart)
+ return false;
+
+ return m_scrollbar->mouseExited();
+}
+
+bool WebScrollbarImpl::onMouseWheel(const WebInputEvent& event)
+{
+ // Same logic as in Scrollview.cpp. If we can move at all, we'll accept the event.
+ WebMouseWheelEvent mousewheel = *static_cast<const WebMouseWheelEvent*>(&event);
+ int maxScrollDelta = m_scrollbar->maximum() - m_scrollbar->value();
+ float delta = m_scrollbar->orientation() == HorizontalScrollbar ? mousewheel.deltaX : mousewheel.deltaY;
+ if ((delta < 0 && maxScrollDelta > 0) || (delta > 0 && m_scrollbar->value() > 0)) {
+ if (mousewheel.scrollByPage) {
+ ASSERT(m_scrollbar->orientation() == VerticalScrollbar);
+ bool negative = delta < 0;
+ delta = max(max(static_cast<float>(m_scrollbar->visibleSize()) * Scrollbar::minFractionToStepWhenPaging(), static_cast<float>(m_scrollbar->visibleSize() - Scrollbar::maxOverlapBetweenPages())), 1.0f);
+ if (negative)
+ delta *= -1;
+ }
+ m_scrollbar->scroll((m_scrollbar->orientation() == HorizontalScrollbar) ? WebCore::ScrollLeft : WebCore::ScrollUp, WebCore::ScrollByPixel, delta);
+ return true;
+ }
+
+ return false;
+ }
+
+bool WebScrollbarImpl::onKeyDown(const WebInputEvent& event)
+{
+ WebKeyboardEvent keyboard = *static_cast<const WebKeyboardEvent*>(&event);
+ int keyCode;
+ // We have to duplicate this logic from WebViewImpl because there it uses
+ // Char and RawKeyDown events, which don't exist at this point.
+ if (keyboard.windowsKeyCode == VKEY_SPACE)
+ keyCode = ((keyboard.modifiers & WebInputEvent::ShiftKey) ? VKEY_PRIOR : VKEY_NEXT);
+ else {
+ if (keyboard.modifiers == WebInputEvent::ControlKey) {
+ // Match FF behavior in the sense that Ctrl+home/end are the only Ctrl
+ // key combinations which affect scrolling. Safari is buggy in the
+ // sense that it scrolls the page for all Ctrl+scrolling key
+ // combinations. For e.g. Ctrl+pgup/pgdn/up/down, etc.
+ switch (keyboard.windowsKeyCode) {
+ case VKEY_HOME:
+ case VKEY_END:
+ break;
+ default:
+ return false;
+ }
+ }
+
+ if (keyboard.isSystemKey || (keyboard.modifiers & WebInputEvent::ShiftKey))
+ return false;
+
+ keyCode = keyboard.windowsKeyCode;
+ }
+ WebCore::ScrollDirection scrollDirection;
+ WebCore::ScrollGranularity scrollGranularity;
+ if (WebViewImpl::mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity)) {
+ // Will return false if scroll direction wasn't compatible with this scrollbar.
+ return m_scrollbar->scroll(scrollDirection, scrollGranularity);
+ }
+ return false;
+}
+
+int WebScrollbarImpl::scrollSize(WebCore::ScrollbarOrientation orientation) const
+{
+ return (orientation == m_scrollbar->orientation()) ? (m_scrollbar->totalSize() - m_scrollbar->visibleSize()) : 0;
+}
+
+void WebScrollbarImpl::setScrollOffsetFromAnimation(const WebCore::IntPoint& offset)
+{
+ m_scrollbar->setValue((m_scrollbar->orientation() == HorizontalScrollbar) ? offset.x() : offset.y(), Scrollbar::FromScrollAnimator);
+}
+
+void WebScrollbarImpl::valueChanged(WebCore::Scrollbar*)
+{
+ m_client->valueChanged(this);
+}
+
+void WebScrollbarImpl::invalidateScrollbarRect(WebCore::Scrollbar*, const WebCore::IntRect& rect)
+{
+ WebRect webrect(rect);
+ webrect.x += m_scrollbar->x();
+ webrect.y += m_scrollbar->y();
+ m_client->invalidateScrollbarRect(this, webrect);
+}
+
+bool WebScrollbarImpl::isActive() const
+{
+ return true;
+}
+
+bool WebScrollbarImpl::scrollbarCornerPresent() const
+{
+ return false;
+}
+
+void WebScrollbarImpl::getTickmarks(Vector<WebCore::IntRect>& tickmarks) const
+{
+ WebVector<WebRect> ticks;
+ m_client->getTickmarks(const_cast<WebScrollbarImpl*>(this), &ticks);
+ tickmarks.resize(ticks.size());
+ for (size_t i = 0; i < ticks.size(); ++i)
+ tickmarks[i] = ticks[i];
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebScrollbarImpl.h b/WebKit/chromium/src/WebScrollbarImpl.h
new file mode 100644
index 0000000..5512867
--- /dev/null
+++ b/WebKit/chromium/src/WebScrollbarImpl.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WebScrollbarImpl_h
+#define WebScrollbarImpl_h
+
+#include "ScrollbarClient.h"
+#include "WebScrollbar.h"
+
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+class Scrollbar;
+}
+
+namespace WebKit {
+
+class WebScrollbarImpl : public WebScrollbar,
+ public WebCore::ScrollbarClient {
+public:
+ WebScrollbarImpl(WebScrollbarClient*, Orientation orientation);
+ ~WebScrollbarImpl();
+
+ // WebKit::WebScrollbar methods
+ virtual void setLocation(const WebRect&);
+ virtual int value() const;
+ virtual void setValue(int position);
+ virtual void setDocumentSize(int size);
+ virtual void scroll(ScrollDirection, ScrollGranularity, float multiplier);
+ virtual void paint(WebCanvas*, const WebRect&);
+ virtual bool handleInputEvent(const WebInputEvent&);
+
+ // WebCore::ScrollbarClient methods
+ virtual int scrollSize(WebCore::ScrollbarOrientation orientation) const;
+ virtual void setScrollOffsetFromAnimation(const WebCore::IntPoint&);
+ virtual void valueChanged(WebCore::Scrollbar*);
+ virtual void invalidateScrollbarRect(WebCore::Scrollbar*, const WebCore::IntRect&);
+ virtual bool isActive() const;
+ virtual bool scrollbarCornerPresent() const;
+ virtual void getTickmarks(Vector<WebCore::IntRect>&) const;
+
+private:
+ bool onMouseDown(const WebInputEvent& event);
+ bool onMouseUp(const WebInputEvent& event);
+ bool onMouseMove(const WebInputEvent& event);
+ bool onMouseLeave(const WebInputEvent& event);
+ bool onMouseWheel(const WebInputEvent& event);
+ bool onKeyDown(const WebInputEvent& event);
+
+ WebScrollbarClient* m_client;
+
+ RefPtr<WebCore::Scrollbar> m_scrollbar;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/WebKit/chromium/src/WebSearchableFormData.cpp b/WebKit/chromium/src/WebSearchableFormData.cpp
index eddaffe..50192eb 100644
--- a/WebKit/chromium/src/WebSearchableFormData.cpp
+++ b/WebKit/chromium/src/WebSearchableFormData.cpp
@@ -62,7 +62,7 @@ void GetFormEncoding(const HTMLFormElement* form, TextEncoding* encoding)
return;
}
const Frame* frame = form->document()->frame();
- *encoding = frame ? TextEncoding(frame->loader()->encoding()) : Latin1Encoding();
+ *encoding = frame ? TextEncoding(frame->loader()->writer()->encoding()) : Latin1Encoding();
}
// Returns true if the submit request results in an HTTP URL.
@@ -77,7 +77,8 @@ bool IsHTTPFormSubmit(const HTMLFormElement* form)
HTMLFormControlElement* GetButtonToActivate(HTMLFormElement* form)
{
HTMLFormControlElement* firstSubmitButton = 0;
- for (Vector<HTMLFormControlElement*>::const_iterator i(form->formElements.begin()); i != form->formElements.end(); ++i) {
+ // FIXME: Consider refactoring this code so that we don't call form->associatedElements() twice.
+ for (Vector<HTMLFormControlElement*>::const_iterator i(form->associatedElements().begin()); i != form->associatedElements().end(); ++i) {
HTMLFormControlElement* formElement = *i;
if (formElement->isActivatedSubmit())
// There's a button that is already activated for submit, return 0.
@@ -130,7 +131,7 @@ bool IsInDefaultState(const HTMLFormControlElement* formElement)
{
if (formElement->hasTagName(HTMLNames::inputTag)) {
const HTMLInputElement* inputElement = static_cast<const HTMLInputElement*>(formElement);
- if (inputElement->inputType() == HTMLInputElement::CHECKBOX || inputElement->inputType() == HTMLInputElement::RADIO)
+ if (inputElement->isCheckbox() || inputElement->isRadioButton())
return inputElement->checked() == inputElement->defaultChecked();
} else if (formElement->hasTagName(HTMLNames::selectTag))
return IsSelectInDefaultState(static_cast<const HTMLSelectElement*>(formElement));
@@ -154,7 +155,8 @@ bool HasSuitableTextElement(const HTMLFormElement* form, Vector<char>* encodedSt
*encodingName = encoding.name();
HTMLInputElement* textElement = 0;
- for (Vector<HTMLFormControlElement*>::const_iterator i(form->formElements.begin()); i != form->formElements.end(); ++i) {
+ // FIXME: Consider refactoring this code so that we don't call form->associatedElements() twice.
+ for (Vector<HTMLFormControlElement*>::const_iterator i(form->associatedElements().begin()); i != form->associatedElements().end(); ++i) {
HTMLFormControlElement* formElement = *i;
if (formElement->disabled() || formElement->name().isNull())
continue;
@@ -164,29 +166,27 @@ bool HasSuitableTextElement(const HTMLFormElement* form, Vector<char>* encodedSt
bool isTextElement = false;
if (formElement->hasTagName(HTMLNames::inputTag)) {
- switch (static_cast<const HTMLInputElement*>(formElement)->inputType()) {
- case HTMLInputElement::TEXT:
- case HTMLInputElement::ISINDEX:
- isTextElement = true;
- break;
- case HTMLInputElement::PASSWORD:
- // Don't store passwords! This is most likely an https anyway.
- // Fall through.
- case HTMLInputElement::FILE:
+ const HTMLInputElement* input = static_cast<const HTMLInputElement*>(formElement);
+ if (input->isFileUpload()) {
// Too big, don't try to index this.
return 0;
- default:
- // All other input types are indexable.
- break;
}
+
+ if (input->isPasswordField()) {
+ // Don't store passwords! This is most likely an https anyway.
+ return 0;
+ }
+
+ if (input->isTextField())
+ isTextElement = true;
}
FormDataList dataList(encoding);
if (!formElement->appendFormData(dataList, false))
continue;
- const Vector<FormDataList::Item>& itemList = dataList.list();
- if (isTextElement && !itemList.isEmpty()) {
+ const Vector<FormDataList::Item>& items = dataList.items();
+ if (isTextElement && !items.isEmpty()) {
if (textElement) {
// The auto-complete bar only knows how to fill in one value.
// This form has multiple fields; don't treat it as searchable.
@@ -194,7 +194,7 @@ bool HasSuitableTextElement(const HTMLFormElement* form, Vector<char>* encodedSt
}
textElement = static_cast<HTMLInputElement*>(formElement);
}
- for (Vector<FormDataList::Item>::const_iterator j(itemList.begin()); j != itemList.end(); ++j) {
+ for (Vector<FormDataList::Item>::const_iterator j(items.begin()); j != items.end(); ++j) {
// Handle ISINDEX / <input name=isindex> specially, but only if it's
// the first entry.
if (!encodedString->isEmpty() || j->data() != "isindex") {
diff --git a/WebKit/chromium/src/WebSecurityOrigin.cpp b/WebKit/chromium/src/WebSecurityOrigin.cpp
index 81546da..adccb31 100644
--- a/WebKit/chromium/src/WebSecurityOrigin.cpp
+++ b/WebKit/chromium/src/WebSecurityOrigin.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -31,8 +31,10 @@
#include "config.h"
#include "WebSecurityOrigin.h"
+#include "KURL.h"
#include "SecurityOrigin.h"
#include "WebString.h"
+#include "WebURL.h"
#include <wtf/PassRefPtr.h>
using namespace WebCore;
@@ -42,9 +44,9 @@ namespace WebKit {
class WebSecurityOriginPrivate : public SecurityOrigin {
};
-WebSecurityOrigin* WebSecurityOrigin::createFromDatabaseIdentifier(const WebString& databaseIdentifier)
+WebSecurityOrigin WebSecurityOrigin::createFromDatabaseIdentifier(const WebString& databaseIdentifier)
{
- return new WebSecurityOrigin(SecurityOrigin::createFromDatabaseIdentifier(databaseIdentifier));
+ return WebSecurityOrigin(SecurityOrigin::createFromDatabaseIdentifier(databaseIdentifier));
}
WebSecurityOrigin WebSecurityOrigin::createFromString(const WebString& origin)
@@ -52,6 +54,11 @@ WebSecurityOrigin WebSecurityOrigin::createFromString(const WebString& origin)
return WebSecurityOrigin(SecurityOrigin::createFromString(origin));
}
+WebSecurityOrigin WebSecurityOrigin::create(const WebURL& url)
+{
+ return WebSecurityOrigin(SecurityOrigin::create(url));
+}
+
void WebSecurityOrigin::reset()
{
assign(0);
@@ -89,18 +96,37 @@ bool WebSecurityOrigin::isEmpty() const
return m_private->isEmpty();
}
+bool WebSecurityOrigin::canAccess(const WebSecurityOrigin& other) const
+{
+ ASSERT(m_private);
+ ASSERT(other.m_private);
+ return m_private->canAccess(other.m_private);
+}
+
+bool WebSecurityOrigin::canRequest(const WebURL& url) const
+{
+ ASSERT(m_private);
+ return m_private->canRequest(url);
+}
+
WebString WebSecurityOrigin::toString() const
{
ASSERT(m_private);
return m_private->toString();
}
-WebString WebSecurityOrigin::databaseIdentifier()
+WebString WebSecurityOrigin::databaseIdentifier() const
{
ASSERT(m_private);
return m_private->databaseIdentifier();
}
+bool WebSecurityOrigin::canAccessPasswordManager() const
+{
+ ASSERT(m_private);
+ return m_private->canAccessPasswordManager();
+}
+
WebSecurityOrigin::WebSecurityOrigin(const WTF::PassRefPtr<WebCore::SecurityOrigin>& origin)
: m_private(static_cast<WebSecurityOriginPrivate*>(origin.releaseRef()))
{
@@ -117,6 +143,11 @@ WebSecurityOrigin::operator WTF::PassRefPtr<WebCore::SecurityOrigin>() const
return PassRefPtr<SecurityOrigin>(const_cast<WebSecurityOriginPrivate*>(m_private));
}
+SecurityOrigin* WebSecurityOrigin::get() const
+{
+ return m_private;
+}
+
void WebSecurityOrigin::assign(WebSecurityOriginPrivate* p)
{
// p is already ref'd for us by the caller
diff --git a/WebKit/chromium/src/WebSecurityPolicy.cpp b/WebKit/chromium/src/WebSecurityPolicy.cpp
index 48b445c..58d0893 100644
--- a/WebKit/chromium/src/WebSecurityPolicy.cpp
+++ b/WebKit/chromium/src/WebSecurityPolicy.cpp
@@ -32,6 +32,7 @@
#include "WebSecurityPolicy.h"
#include "FrameLoader.h"
+#include "SchemeRegistry.h"
#include "SecurityOrigin.h"
#include "WebString.h"
@@ -43,27 +44,44 @@ namespace WebKit {
void WebSecurityPolicy::registerURLSchemeAsLocal(const WebString& scheme)
{
- SecurityOrigin::registerURLSchemeAsLocal(scheme);
+ SchemeRegistry::registerURLSchemeAsLocal(scheme);
}
void WebSecurityPolicy::registerURLSchemeAsNoAccess(const WebString& scheme)
{
- SecurityOrigin::registerURLSchemeAsNoAccess(scheme);
+ SchemeRegistry::registerURLSchemeAsNoAccess(scheme);
}
-void WebSecurityPolicy::whiteListAccessFromOrigin(const WebURL& sourceOrigin,
+void WebSecurityPolicy::registerURLSchemeAsSecure(const WebString& scheme)
+{
+ SchemeRegistry::registerURLSchemeAsSecure(scheme);
+}
+
+void WebSecurityPolicy::addOriginAccessWhitelistEntry(
+ const WebURL& sourceOrigin,
+ const WebString& destinationProtocol,
+ const WebString& destinationHost,
+ bool allowDestinationSubdomains)
+{
+ SecurityOrigin::addOriginAccessWhitelistEntry(
+ *SecurityOrigin::create(sourceOrigin), destinationProtocol,
+ destinationHost, allowDestinationSubdomains);
+}
+
+void WebSecurityPolicy::removeOriginAccessWhitelistEntry(
+ const WebURL& sourceOrigin,
const WebString& destinationProtocol,
const WebString& destinationHost,
bool allowDestinationSubdomains)
{
- SecurityOrigin::whiteListAccessFromOrigin(
+ SecurityOrigin::removeOriginAccessWhitelistEntry(
*SecurityOrigin::create(sourceOrigin), destinationProtocol,
destinationHost, allowDestinationSubdomains);
}
-void WebSecurityPolicy::resetOriginAccessWhiteLists()
+void WebSecurityPolicy::resetOriginAccessWhitelists()
{
- SecurityOrigin::resetOriginAccessWhiteLists();
+ SecurityOrigin::resetOriginAccessWhitelists();
}
bool WebSecurityPolicy::shouldHideReferrer(const WebURL& url, const WebString& referrer)
diff --git a/WebKit/chromium/src/WebSelectElement.cpp b/WebKit/chromium/src/WebSelectElement.cpp
new file mode 100644
index 0000000..79a4d85
--- /dev/null
+++ b/WebKit/chromium/src/WebSelectElement.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebSelectElement.h"
+
+#include "HTMLNames.h"
+#include "HTMLOptionElement.h"
+#include "HTMLSelectElement.h"
+#include "WebString.h"
+#include <wtf/PassRefPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebSelectElement::setValue(const WebString& value)
+{
+ unwrap<HTMLSelectElement>()->setValue(value);
+}
+
+WebString WebSelectElement::value()
+{
+ return unwrap<HTMLSelectElement>()->value();
+}
+
+WebVector<WebElement> WebSelectElement::listItems()
+{
+ const Vector<Element*>& sourceItems = unwrap<HTMLSelectElement>()->listItems();
+ WebVector<WebElement> items(sourceItems.size());
+ for (size_t i = 0; i < sourceItems.size(); ++i)
+ items[i] = WebElement(static_cast<HTMLElement*>(sourceItems[i]));
+
+ return items;
+}
+
+WebSelectElement::WebSelectElement(const PassRefPtr<HTMLSelectElement>& elem)
+ : WebFormControlElement(elem)
+{
+}
+
+WebSelectElement& WebSelectElement::operator=(const PassRefPtr<HTMLSelectElement>& elem)
+{
+ m_private = elem;
+ return *this;
+}
+
+WebSelectElement::operator PassRefPtr<HTMLSelectElement>() const
+{
+ return static_cast<HTMLSelectElement*>(m_private.get());
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebSerializedScriptValue.cpp b/WebKit/chromium/src/WebSerializedScriptValue.cpp
new file mode 100644
index 0000000..7149a4d
--- /dev/null
+++ b/WebKit/chromium/src/WebSerializedScriptValue.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebSerializedScriptValue.h"
+
+#include "SerializedScriptValue.h"
+#include "WebString.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebSerializedScriptValue WebSerializedScriptValue::fromString(const WebString& s)
+{
+ return SerializedScriptValue::createFromWire(s);
+}
+
+WebSerializedScriptValue WebSerializedScriptValue::createInvalid()
+{
+ return SerializedScriptValue::create();
+}
+
+void WebSerializedScriptValue::reset()
+{
+ m_private.reset();
+}
+
+void WebSerializedScriptValue::assign(const WebSerializedScriptValue& other)
+{
+ m_private = other.m_private;
+}
+
+WebString WebSerializedScriptValue::toString() const
+{
+ return m_private->toWireString();
+}
+
+WebSerializedScriptValue::WebSerializedScriptValue(const PassRefPtr<SerializedScriptValue>& value)
+ : m_private(value)
+{
+}
+
+WebSerializedScriptValue& WebSerializedScriptValue::operator=(const PassRefPtr<SerializedScriptValue>& value)
+{
+ m_private = value;
+ return *this;
+}
+
+WebSerializedScriptValue::operator PassRefPtr<SerializedScriptValue>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebSettingsImpl.cpp b/WebKit/chromium/src/WebSettingsImpl.cpp
index 5cfbd4f..e60562c 100644
--- a/WebKit/chromium/src/WebSettingsImpl.cpp
+++ b/WebKit/chromium/src/WebSettingsImpl.cpp
@@ -185,6 +185,11 @@ void WebSettingsImpl::setUserStyleSheetLocation(const WebURL& location)
m_settings->setUserStyleSheetLocation(location);
}
+void WebSettingsImpl::setAuthorAndUserStylesEnabled(bool enabled)
+{
+ m_settings->setAuthorAndUserStylesEnabled(enabled);
+}
+
void WebSettingsImpl::setUsesPageCache(bool usesPageCache)
{
m_settings->setUsesPageCache(usesPageCache);
@@ -195,6 +200,11 @@ void WebSettingsImpl::setDownloadableBinaryFontsEnabled(bool enabled)
m_settings->setDownloadableBinaryFontsEnabled(enabled);
}
+void WebSettingsImpl::setJavaScriptCanAccessClipboard(bool enabled)
+{
+ m_settings->setJavaScriptCanAccessClipboard(enabled);
+}
+
void WebSettingsImpl::setXSSAuditorEnabled(bool enabled)
{
m_settings->setXSSAuditorEnabled(enabled);
@@ -213,6 +223,11 @@ void WebSettingsImpl::setEditableLinkBehaviorNeverLive()
m_settings->setEditableLinkBehavior(WebCore::EditableLinkNeverLive);
}
+void WebSettingsImpl::setFrameFlatteningEnabled(bool enabled)
+{
+ m_settings->setFrameFlatteningEnabled(enabled);
+}
+
void WebSettingsImpl::setFontRenderingModeNormal()
{
// FIXME: If you ever need more behaviors than this, then we should probably
@@ -226,14 +241,14 @@ void WebSettingsImpl::setShouldPaintCustomScrollbars(bool enabled)
m_settings->setShouldPaintCustomScrollbars(enabled);
}
-void WebSettingsImpl::setDatabasesEnabled(bool enabled)
+void WebSettingsImpl::setAllowUniversalAccessFromFileURLs(bool allow)
{
- m_settings->setDatabasesEnabled(enabled);
+ m_settings->setAllowUniversalAccessFromFileURLs(allow);
}
-void WebSettingsImpl::setAllowUniversalAccessFromFileURLs(bool allow)
+void WebSettingsImpl::setAllowFileAccessFromFileURLs(bool allow)
{
- m_settings->setAllowUniversalAccessFromFileURLs(allow);
+ m_settings->setAllowFileAccessFromFileURLs(allow);
}
void WebSettingsImpl::setTextDirectionSubmenuInclusionBehaviorNeverIncluded()
@@ -254,9 +269,64 @@ void WebSettingsImpl::setExperimentalWebGLEnabled(bool enabled)
m_settings->setWebGLEnabled(enabled);
}
-void WebSettingsImpl::setGeolocationEnabled(bool enabled)
+void WebSettingsImpl::setShowDebugBorders(bool show)
+{
+ m_settings->setShowDebugBorders(show);
+}
+
+void WebSettingsImpl::setEditingBehavior(EditingBehavior behavior)
+{
+ m_settings->setEditingBehaviorType(static_cast<WebCore::EditingBehaviorType>(behavior));
+}
+
+void WebSettingsImpl::setAcceleratedCompositingEnabled(bool enabled)
+{
+ m_settings->setAcceleratedCompositingEnabled(enabled);
+}
+
+void WebSettingsImpl::setAcceleratedCompositingFor3DTransformsEnabled(bool enabled)
+{
+ m_settings->setAcceleratedCompositingFor3DTransformsEnabled(enabled);
+}
+
+void WebSettingsImpl::setAcceleratedCompositingForVideoEnabled(bool enabled)
+{
+ m_settings->setAcceleratedCompositingForVideoEnabled(enabled);
+}
+
+void WebSettingsImpl::setAcceleratedCompositingForPluginsEnabled(bool enabled)
+{
+ m_settings->setAcceleratedCompositingForPluginsEnabled(enabled);
+}
+
+void WebSettingsImpl::setAcceleratedCompositingForCanvasEnabled(bool enabled)
+{
+ m_settings->setAcceleratedCompositingForCanvasEnabled(enabled);
+}
+
+void WebSettingsImpl::setAcceleratedCompositingForAnimationEnabled(bool enabled)
+{
+ m_settings->setAcceleratedCompositingForAnimationEnabled(enabled);
+}
+
+void WebSettingsImpl::setAccelerated2dCanvasEnabled(bool enabled)
+{
+ m_settings->setAccelerated2dCanvasEnabled(enabled);
+}
+
+void WebSettingsImpl::setMemoryInfoEnabled(bool enabled)
+{
+ m_settings->setMemoryInfoEnabled(enabled);
+}
+
+void WebSettingsImpl::setHyperlinkAuditingEnabled(bool enabled)
+{
+ m_settings->setHyperlinkAuditingEnabled(enabled);
+}
+
+void WebSettingsImpl::setCaretBrowsingEnabled(bool enabled)
{
- m_settings->setGeolocationEnabled(enabled);
+ m_settings->setCaretBrowsingEnabled(enabled);
}
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebSettingsImpl.h b/WebKit/chromium/src/WebSettingsImpl.h
index 3b69fe6..ffdc8d3 100644
--- a/WebKit/chromium/src/WebSettingsImpl.h
+++ b/WebKit/chromium/src/WebSettingsImpl.h
@@ -31,8 +31,7 @@
#ifndef WebSettingsImpl_h
#define WebSettingsImpl_h
-// TODO(jorlow): Remove this hack once WebView is free of glue.
-#include "../public/WebSettings.h"
+#include "WebSettings.h"
namespace WebCore {
class Settings;
@@ -71,19 +70,33 @@ public:
virtual void setJavaEnabled(bool);
virtual void setAllowScriptsToCloseWindows(bool);
virtual void setUserStyleSheetLocation(const WebURL&);
+ virtual void setAuthorAndUserStylesEnabled(bool);
virtual void setUsesPageCache(bool);
virtual void setDownloadableBinaryFontsEnabled(bool);
+ virtual void setJavaScriptCanAccessClipboard(bool);
virtual void setXSSAuditorEnabled(bool);
virtual void setLocalStorageEnabled(bool);
virtual void setEditableLinkBehaviorNeverLive();
+ virtual void setFrameFlatteningEnabled(bool);
virtual void setFontRenderingModeNormal();
virtual void setShouldPaintCustomScrollbars(bool);
- virtual void setDatabasesEnabled(bool);
virtual void setAllowUniversalAccessFromFileURLs(bool);
+ virtual void setAllowFileAccessFromFileURLs(bool);
virtual void setTextDirectionSubmenuInclusionBehaviorNeverIncluded();
virtual void setOfflineWebApplicationCacheEnabled(bool);
virtual void setExperimentalWebGLEnabled(bool);
- virtual void setGeolocationEnabled(bool);
+ virtual void setShowDebugBorders(bool);
+ virtual void setEditingBehavior(EditingBehavior);
+ virtual void setAcceleratedCompositingEnabled(bool);
+ virtual void setAcceleratedCompositingFor3DTransformsEnabled(bool);
+ virtual void setAcceleratedCompositingForVideoEnabled(bool);
+ virtual void setAcceleratedCompositingForPluginsEnabled(bool);
+ virtual void setAcceleratedCompositingForCanvasEnabled(bool);
+ virtual void setAcceleratedCompositingForAnimationEnabled(bool);
+ virtual void setAccelerated2dCanvasEnabled(bool);
+ virtual void setMemoryInfoEnabled(bool);
+ virtual void setHyperlinkAuditingEnabled(bool);
+ virtual void setCaretBrowsingEnabled(bool);
private:
WebCore::Settings* m_settings;
diff --git a/WebKit/chromium/src/WebSharedWorkerImpl.cpp b/WebKit/chromium/src/WebSharedWorkerImpl.cpp
index 4547336..e73c0f4 100644
--- a/WebKit/chromium/src/WebSharedWorkerImpl.cpp
+++ b/WebKit/chromium/src/WebSharedWorkerImpl.cpp
@@ -31,7 +31,7 @@
#include "config.h"
#include "WebSharedWorkerImpl.h"
-#include "GenericWorkerTask.h"
+#include "CrossThreadTask.h"
#include "KURL.h"
#include "MessageEvent.h"
#include "MessagePortChannel.h"
@@ -85,14 +85,14 @@ void WebSharedWorkerImpl::connectTask(ScriptExecutionContext* context, WebShared
{
// Wrap the passed-in channel in a MessagePort, and send it off via a connect event.
RefPtr<MessagePort> port = MessagePort::create(*context);
- port->entangle(channel.release());
+ port->entangle(channel);
ASSERT(context->isWorkerContext());
WorkerContext* workerContext = static_cast<WorkerContext*>(context);
ASSERT(workerContext->isSharedWorkerContext());
workerContext->toSharedWorkerContext()->dispatchEvent(createConnectEvent(port));
}
-void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& userAgent, const WebString& sourceCode)
+void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& userAgent, const WebString& sourceCode, long long)
{
initializeLoader(url);
setWorkerThread(SharedWorkerThread::create(name, url, userAgent, sourceCode, *this, *this));
diff --git a/WebKit/chromium/src/WebSharedWorkerImpl.h b/WebKit/chromium/src/WebSharedWorkerImpl.h
index 7c10d76..b591c7b 100644
--- a/WebKit/chromium/src/WebSharedWorkerImpl.h
+++ b/WebKit/chromium/src/WebSharedWorkerImpl.h
@@ -51,7 +51,7 @@ public:
// WebSharedWorker methods:
virtual bool isStarted();
- virtual void startWorkerContext(const WebURL&, const WebString& name, const WebString& userAgent, const WebString& sourceCode);
+ virtual void startWorkerContext(const WebURL&, const WebString& name, const WebString& userAgent, const WebString& sourceCode, long long);
virtual void connect(WebMessagePortChannel*, ConnectListener*);
virtual void terminateWorkerContext();
virtual void clientDestroyed();
diff --git a/WebKit/chromium/src/WebSpeechInputControllerMockImpl.cpp b/WebKit/chromium/src/WebSpeechInputControllerMockImpl.cpp
new file mode 100644
index 0000000..48f8b50
--- /dev/null
+++ b/WebKit/chromium/src/WebSpeechInputControllerMockImpl.cpp
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebSpeechInputControllerMockImpl.h"
+
+#include "PlatformString.h"
+#include "SpeechInputClientMock.h"
+#include "WebRect.h"
+
+namespace WebKit {
+
+WebSpeechInputControllerMock* WebSpeechInputControllerMock::create(WebSpeechInputListener* listener)
+{
+ return new WebSpeechInputControllerMockImpl(listener);
+}
+
+WebSpeechInputControllerMockImpl::WebSpeechInputControllerMockImpl(
+ WebSpeechInputListener* listener)
+ : m_webcoreMock(new WebCore::SpeechInputClientMock())
+ , m_listener(listener)
+{
+ m_webcoreMock->setListener(this);
+}
+
+WebSpeechInputControllerMockImpl::~WebSpeechInputControllerMockImpl()
+{
+ m_webcoreMock->setListener(0);
+}
+
+void WebSpeechInputControllerMockImpl::addMockRecognitionResult(const WebString& result, double confidence, const WebString &language)
+{
+ m_webcoreMock->addRecognitionResult(result, confidence, language);
+}
+
+void WebSpeechInputControllerMockImpl::clearResults()
+{
+ m_webcoreMock->clearResults();
+}
+
+void WebSpeechInputControllerMockImpl::didCompleteRecording(int requestId)
+{
+ m_listener->didCompleteRecording(requestId);
+}
+
+void WebSpeechInputControllerMockImpl::didCompleteRecognition(int requestId)
+{
+ m_listener->didCompleteRecognition(requestId);
+}
+
+void WebSpeechInputControllerMockImpl::setRecognitionResult(int requestId, const WebCore::SpeechInputResultArray& result)
+{
+ m_listener->setRecognitionResult(requestId, result);
+}
+
+bool WebSpeechInputControllerMockImpl::startRecognition(int requestId, const WebRect& elementRect, const WebString& language, const WebString& grammar)
+{
+ return m_webcoreMock->startRecognition(requestId, elementRect, language, grammar);
+}
+
+void WebSpeechInputControllerMockImpl::cancelRecognition(int requestId)
+{
+ m_webcoreMock->cancelRecognition(requestId);
+}
+
+void WebSpeechInputControllerMockImpl::stopRecording(int requestId)
+{
+ m_webcoreMock->stopRecording(requestId);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebSpeechInputControllerMockImpl.h b/WebKit/chromium/src/WebSpeechInputControllerMockImpl.h
new file mode 100644
index 0000000..bf00ed0
--- /dev/null
+++ b/WebKit/chromium/src/WebSpeechInputControllerMockImpl.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WebSpeechInputControllerMockImpl_h
+#define WebSpeechInputControllerMockImpl_h
+
+#include "SpeechInputListener.h"
+#include "WebSpeechInputControllerMock.h"
+#include "WebSpeechInputListener.h"
+#include "WebString.h"
+#include <wtf/OwnPtr.h>
+
+namespace WebCore {
+class SpeechInputClientMock;
+}
+
+namespace WebKit {
+
+struct WebRect;
+
+class WebSpeechInputControllerMockImpl : public WebCore::SpeechInputListener
+ , public WebSpeechInputControllerMock {
+public:
+ WebSpeechInputControllerMockImpl(WebSpeechInputListener*);
+ virtual ~WebSpeechInputControllerMockImpl();
+
+ // WebCore::SpeechInputListener methods.
+ void didCompleteRecording(int requestId);
+ void didCompleteRecognition(int requestId);
+ void setRecognitionResult(int requestId, const WebCore::SpeechInputResultArray& result);
+
+ // WebSpeechInputController methods.
+ bool startRecognition(int requestId, const WebRect& elementRect, const WebString& language, const WebString& grammar);
+ void cancelRecognition(int requestId);
+ void stopRecording(int requestId);
+
+ // WebSpeechInputControllerMock methods.
+ void addMockRecognitionResult(const WebString& result, double confidence, const WebString& language);
+ void clearResults();
+
+private:
+ OwnPtr<WebCore::SpeechInputClientMock> m_webcoreMock;
+ WebSpeechInputListener* m_listener;
+};
+
+} // namespace WebKit
+
+#endif // WebSpeechInputControllerMockImpl_h
diff --git a/WebKit/chromium/src/WebSpeechInputResult.cpp b/WebKit/chromium/src/WebSpeechInputResult.cpp
new file mode 100644
index 0000000..1cafc84
--- /dev/null
+++ b/WebKit/chromium/src/WebSpeechInputResult.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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.
+ */
+
+#include "config.h"
+#include "WebSpeechInputResult.h"
+
+#include "SpeechInputResult.h"
+#include <wtf/PassRefPtr.h>
+
+namespace WebKit {
+
+void WebSpeechInputResult::reset()
+{
+ m_private.reset();
+}
+
+WebSpeechInputResult::WebSpeechInputResult(const PassRefPtr<WebCore::SpeechInputResult>& value)
+ : m_private(value)
+{
+}
+
+void WebSpeechInputResult::set(const WebString& utterance, double confidence)
+{
+ m_private = WebCore::SpeechInputResult::create(utterance, confidence);
+}
+
+WebSpeechInputResult::operator PassRefPtr<WebCore::SpeechInputResult>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebStorageAreaImpl.cpp b/WebKit/chromium/src/WebStorageAreaImpl.cpp
index 9a7fd5c..2cecfe9 100644
--- a/WebKit/chromium/src/WebStorageAreaImpl.cpp
+++ b/WebKit/chromium/src/WebStorageAreaImpl.cpp
@@ -66,7 +66,7 @@ WebString WebStorageAreaImpl::getItem(const WebString& key)
return m_storageArea->getItem(key);
}
-void WebStorageAreaImpl::setItem(const WebString& key, const WebString& value, const WebURL& url, Result& result, WebString& oldValue)
+void WebStorageAreaImpl::setItem(const WebString& key, const WebString& value, const WebURL& url, Result& result, WebString& oldValue, WebFrame*)
{
int exceptionCode = 0;
diff --git a/WebKit/chromium/src/WebStorageAreaImpl.h b/WebKit/chromium/src/WebStorageAreaImpl.h
index e9a11c2..2869fc9 100644
--- a/WebKit/chromium/src/WebStorageAreaImpl.h
+++ b/WebKit/chromium/src/WebStorageAreaImpl.h
@@ -45,7 +45,7 @@ public:
virtual unsigned length();
virtual WebString key(unsigned index);
virtual WebString getItem(const WebString& key);
- virtual void setItem(const WebString& key, const WebString& value, const WebURL& url, Result& result, WebString& oldValue);
+ virtual void setItem(const WebString& key, const WebString& value, const WebURL& url, Result& result, WebString& oldValue, WebFrame*);
virtual void removeItem(const WebString& key, const WebURL& url, WebString& oldValue);
virtual void clear(const WebURL& url, bool& somethingCleared);
diff --git a/WebKit/chromium/src/WebStorageNamespaceImpl.cpp b/WebKit/chromium/src/WebStorageNamespaceImpl.cpp
index e6f6548..53b4a75 100644
--- a/WebKit/chromium/src/WebStorageNamespaceImpl.cpp
+++ b/WebKit/chromium/src/WebStorageNamespaceImpl.cpp
@@ -45,9 +45,9 @@ WebStorageNamespace* WebStorageNamespace::createLocalStorageNamespace(const WebS
return new WebStorageNamespaceImpl(WebCore::StorageNamespaceImpl::localStorageNamespace(path, quota));
}
-WebStorageNamespace* WebStorageNamespace::createSessionStorageNamespace()
+WebStorageNamespace* WebStorageNamespace::createSessionStorageNamespace(unsigned quota)
{
- return new WebStorageNamespaceImpl(WebCore::StorageNamespaceImpl::sessionStorageNamespace());
+ return new WebStorageNamespaceImpl(WebCore::StorageNamespaceImpl::sessionStorageNamespace(quota));
}
WebStorageNamespaceImpl::WebStorageNamespaceImpl(PassRefPtr<WebCore::StorageNamespace> storageNamespace)
@@ -61,7 +61,7 @@ WebStorageNamespaceImpl::~WebStorageNamespaceImpl()
WebStorageArea* WebStorageNamespaceImpl::createStorageArea(const WebString& originString)
{
- WebCore::String originWebCoreString = originString;
+ WTF::String originWebCoreString = originString;
if (originWebCoreString == "file://") {
// FIXME: We should really be passing around WebSecurityOrigin objects
// to represent security origins instead of strings. One issue
diff --git a/WebKit/chromium/src/WebString.cpp b/WebKit/chromium/src/WebString.cpp
index 36d5f86..a091ef4 100644
--- a/WebKit/chromium/src/WebString.cpp
+++ b/WebKit/chromium/src/WebString.cpp
@@ -31,15 +31,15 @@
#include "config.h"
#include "WebString.h"
-#include "AtomicString.h"
-#include "CString.h"
#include "PlatformString.h"
+#include <wtf/text/CString.h>
+#include <wtf/text/AtomicString.h>
#include "WebCString.h"
namespace WebKit {
-class WebStringPrivate : public WebCore::StringImpl {
+class WebStringPrivate : public WTF::StringImpl {
};
void WebString::reset()
@@ -58,7 +58,7 @@ void WebString::assign(const WebString& other)
void WebString::assign(const WebUChar* data, size_t length)
{
assign(static_cast<WebStringPrivate*>(
- WebCore::StringImpl::create(data, length).get()));
+ WTF::StringImpl::create(data, length).get()));
}
size_t WebString::length() const
@@ -73,17 +73,17 @@ const WebUChar* WebString::data() const
WebCString WebString::utf8() const
{
- return WebCore::String(m_private).utf8();
+ return WTF::String(m_private).utf8();
}
WebString WebString::fromUTF8(const char* data, size_t length)
{
- return WebCore::String::fromUTF8(data, length);
+ return WTF::String::fromUTF8(data, length);
}
WebString WebString::fromUTF8(const char* data)
{
- return WebCore::String::fromUTF8(data);
+ return WTF::String::fromUTF8(data);
}
bool WebString::equals(const WebString& s) const
@@ -91,39 +91,39 @@ bool WebString::equals(const WebString& s) const
return equal(m_private, s.m_private);
}
-WebString::WebString(const WebCore::String& s)
+WebString::WebString(const WTF::String& s)
: m_private(static_cast<WebStringPrivate*>(s.impl()))
{
if (m_private)
m_private->ref();
}
-WebString& WebString::operator=(const WebCore::String& s)
+WebString& WebString::operator=(const WTF::String& s)
{
assign(static_cast<WebStringPrivate*>(s.impl()));
return *this;
}
-WebString::operator WebCore::String() const
+WebString::operator WTF::String() const
{
return m_private;
}
-WebString::WebString(const WebCore::AtomicString& s)
+WebString::WebString(const WTF::AtomicString& s)
: m_private(0)
{
assign(s.string());
}
-WebString& WebString::operator=(const WebCore::AtomicString& s)
+WebString& WebString::operator=(const WTF::AtomicString& s)
{
assign(s.string());
return *this;
}
-WebString::operator WebCore::AtomicString() const
+WebString::operator WTF::AtomicString() const
{
- return WebCore::AtomicString(static_cast<WebCore::StringImpl *>(m_private));
+ return WTF::AtomicString(static_cast<WTF::StringImpl *>(m_private));
}
void WebString::assign(WebStringPrivate* p)
diff --git a/WebKit/chromium/src/WebTextRun.cpp b/WebKit/chromium/src/WebTextRun.cpp
new file mode 100644
index 0000000..58d9fac
--- /dev/null
+++ b/WebKit/chromium/src/WebTextRun.cpp
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebTextRun.h"
+
+#include "TextRun.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebTextRun::operator WebCore::TextRun() const
+{
+ return TextRun(text, false, 0, 0, rtl, directionalOverride);
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebThreadSafeData.cpp b/WebKit/chromium/src/WebThreadSafeData.cpp
new file mode 100755
index 0000000..facaba3
--- /dev/null
+++ b/WebKit/chromium/src/WebThreadSafeData.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebThreadSafeData.h"
+
+#include "BlobData.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebThreadSafeData::reset()
+{
+ m_private.reset();
+}
+
+void WebThreadSafeData::assign(const WebThreadSafeData& other)
+{
+ m_private = other.m_private;
+}
+
+size_t WebThreadSafeData::size() const
+{
+ if (m_private.isNull())
+ return 0;
+ return m_private->length();
+}
+
+const char* WebThreadSafeData::data() const
+{
+ if (m_private.isNull())
+ return 0;
+ return m_private->data();
+}
+
+WebThreadSafeData::WebThreadSafeData(const PassRefPtr<RawData>& data)
+ : m_private(data.releaseRef())
+{
+}
+
+WebThreadSafeData& WebThreadSafeData::operator=(const PassRefPtr<RawData>& data)
+{
+ m_private = data;
+ return *this;
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebURLError.cpp b/WebKit/chromium/src/WebURLError.cpp
index a038aee..ef32b5c 100644
--- a/WebKit/chromium/src/WebURLError.cpp
+++ b/WebKit/chromium/src/WebURLError.cpp
@@ -31,9 +31,9 @@
#include "config.h"
#include "WebURLError.h"
-#include "CString.h"
#include "KURL.h"
#include "ResourceError.h"
+#include <wtf/text/CString.h>
using namespace WebCore;
diff --git a/WebKit/chromium/src/WebURLLoadTiming.cpp b/WebKit/chromium/src/WebURLLoadTiming.cpp
new file mode 100644
index 0000000..27ed362
--- /dev/null
+++ b/WebKit/chromium/src/WebURLLoadTiming.cpp
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebURLLoadTiming.h"
+
+#include "ResourceLoadTiming.h"
+#include "WebString.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebURLLoadTiming::initialize()
+{
+ m_private = ResourceLoadTiming::create();
+}
+
+void WebURLLoadTiming::reset()
+{
+ m_private.reset();
+}
+
+void WebURLLoadTiming::assign(const WebURLLoadTiming& other)
+{
+ m_private = other.m_private;
+}
+
+double WebURLLoadTiming::requestTime() const
+{
+ return m_private->requestTime;
+}
+
+void WebURLLoadTiming::setRequestTime(double time)
+{
+ m_private->requestTime = time;
+}
+
+int WebURLLoadTiming::proxyStart() const
+{
+ return m_private->proxyStart;
+}
+
+void WebURLLoadTiming::setProxyStart(int start)
+{
+ m_private->proxyStart = start;
+}
+
+int WebURLLoadTiming::proxyEnd() const
+{
+ return m_private->proxyEnd;
+}
+
+void WebURLLoadTiming::setProxyEnd(int end)
+{
+ m_private->proxyEnd = end;
+}
+
+int WebURLLoadTiming::dnsStart() const
+{
+ return m_private->dnsStart;
+}
+
+void WebURLLoadTiming::setDNSStart(int start)
+{
+ m_private->dnsStart = start;
+}
+
+int WebURLLoadTiming::dnsEnd() const
+{
+ return m_private->dnsEnd;
+}
+
+void WebURLLoadTiming::setDNSEnd(int end)
+{
+ m_private->dnsEnd = end;
+}
+
+int WebURLLoadTiming::connectStart() const
+{
+ return m_private->connectStart;
+}
+
+void WebURLLoadTiming::setConnectStart(int start)
+{
+ m_private->connectStart = start;
+}
+
+int WebURLLoadTiming::connectEnd() const
+{
+ return m_private->connectEnd;
+}
+
+void WebURLLoadTiming::setConnectEnd(int end)
+{
+ m_private->connectEnd = end;
+}
+
+int WebURLLoadTiming::sendStart() const
+{
+ return m_private->sendStart;
+}
+
+void WebURLLoadTiming::setSendStart(int start)
+{
+ m_private->sendStart = start;
+}
+
+int WebURLLoadTiming::sendEnd() const
+{
+ return m_private->sendEnd;
+}
+
+void WebURLLoadTiming::setSendEnd(int end)
+{
+ m_private->sendEnd = end;
+}
+
+int WebURLLoadTiming::receiveHeadersEnd() const
+{
+ return m_private->receiveHeadersEnd;
+}
+
+void WebURLLoadTiming::setReceiveHeadersEnd(int end)
+{
+ m_private->receiveHeadersEnd = end;
+}
+
+int WebURLLoadTiming::sslStart() const
+{
+ return m_private->sslStart;
+}
+
+void WebURLLoadTiming::setSSLStart(int start)
+{
+ m_private->sslStart = start;
+}
+
+int WebURLLoadTiming::sslEnd() const
+{
+ return m_private->sslEnd;
+}
+
+void WebURLLoadTiming::setSSLEnd(int end)
+{
+ m_private->sslEnd = end;
+}
+
+WebURLLoadTiming::WebURLLoadTiming(const PassRefPtr<ResourceLoadTiming>& value)
+ : m_private(value)
+{
+}
+
+WebURLLoadTiming& WebURLLoadTiming::operator=(const PassRefPtr<ResourceLoadTiming>& value)
+{
+ m_private = value;
+ return *this;
+}
+
+WebURLLoadTiming::operator PassRefPtr<ResourceLoadTiming>() const
+{
+ return m_private.get();
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/WebURLRequest.cpp b/WebKit/chromium/src/WebURLRequest.cpp
index 46fa842..7a77ca3 100644
--- a/WebKit/chromium/src/WebURLRequest.cpp
+++ b/WebKit/chromium/src/WebURLRequest.cpp
@@ -55,6 +55,8 @@ public:
: m_resourceRequestAllocation(*p->m_resourceRequest)
{
m_resourceRequest = &m_resourceRequestAllocation;
+ m_allowStoredCredentials = p->m_allowStoredCredentials;
+ m_downloadToFile = p->m_downloadToFile;
}
virtual void dispose() { delete this; }
@@ -194,11 +196,41 @@ void WebURLRequest::setReportUploadProgress(bool reportUploadProgress)
m_private->m_resourceRequest->setReportUploadProgress(reportUploadProgress);
}
+bool WebURLRequest::reportLoadTiming() const
+{
+ return m_private->m_resourceRequest->reportLoadTiming();
+}
+
+void WebURLRequest::setReportRawHeaders(bool reportRawHeaders)
+{
+ m_private->m_resourceRequest->setReportRawHeaders(reportRawHeaders);
+}
+
+bool WebURLRequest::reportRawHeaders() const
+{
+ return m_private->m_resourceRequest->reportRawHeaders();
+}
+
+void WebURLRequest::setReportLoadTiming(bool reportLoadTiming)
+{
+ m_private->m_resourceRequest->setReportLoadTiming(reportLoadTiming);
+}
+
WebURLRequest::TargetType WebURLRequest::targetType() const
{
return static_cast<TargetType>(m_private->m_resourceRequest->targetType());
}
+bool WebURLRequest::hasUserGesture() const
+{
+ return m_private->m_resourceRequest->hasUserGesture();
+}
+
+void WebURLRequest::setHasUserGesture(bool hasUserGesture)
+{
+ m_private->m_resourceRequest->setHasUserGesture(hasUserGesture);
+}
+
void WebURLRequest::setTargetType(TargetType targetType)
{
m_private->m_resourceRequest->setTargetType(
@@ -235,6 +267,16 @@ void WebURLRequest::setAppCacheHostID(int appCacheHostID)
m_private->m_resourceRequest->setAppCacheHostID(appCacheHostID);
}
+bool WebURLRequest::downloadToFile() const
+{
+ return m_private->m_downloadToFile;
+}
+
+void WebURLRequest::setDownloadToFile(bool downloadToFile)
+{
+ m_private->m_downloadToFile = downloadToFile;
+}
+
ResourceRequest& WebURLRequest::toMutableResourceRequest()
{
ASSERT(m_private);
diff --git a/WebKit/chromium/src/WebURLRequestPrivate.h b/WebKit/chromium/src/WebURLRequestPrivate.h
index 2f7c25f..79f6451 100644
--- a/WebKit/chromium/src/WebURLRequestPrivate.h
+++ b/WebKit/chromium/src/WebURLRequestPrivate.h
@@ -37,13 +37,19 @@ namespace WebKit {
class WebURLRequestPrivate {
public:
- WebURLRequestPrivate() : m_resourceRequest(0), m_allowStoredCredentials(true) { }
+ WebURLRequestPrivate()
+ : m_resourceRequest(0)
+ , m_allowStoredCredentials(true)
+ , m_downloadToFile(false) { }
// Called by WebURLRequest when it no longer needs this object.
virtual void dispose() = 0;
WebCore::ResourceRequest* m_resourceRequest;
bool m_allowStoredCredentials;
+
+ // FIXME: Move this to ResourceRequest once we have an internal consumer.
+ bool m_downloadToFile;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebURLResponse.cpp b/WebKit/chromium/src/WebURLResponse.cpp
index 95e0be2..bf3c521 100644
--- a/WebKit/chromium/src/WebURLResponse.cpp
+++ b/WebKit/chromium/src/WebURLResponse.cpp
@@ -32,12 +32,17 @@
#include "WebURLResponse.h"
#include "ResourceResponse.h"
+#include "ResourceLoadTiming.h"
#include "WebHTTPHeaderVisitor.h"
+#include "WebHTTPLoadInfo.h"
#include "WebString.h"
#include "WebURL.h"
+#include "WebURLLoadTiming.h"
#include "WebURLResponsePrivate.h"
+#include <wtf/RefPtr.h>
+
using namespace WebCore;
namespace WebKit {
@@ -55,6 +60,7 @@ public:
: m_resourceResponseAllocation(*p->m_resourceResponse)
{
m_resourceResponse = &m_resourceResponseAllocation;
+ m_downloadFilePath = p->m_downloadFilePath;
}
virtual void dispose() { delete this; }
@@ -93,6 +99,57 @@ void WebURLResponse::setURL(const WebURL& url)
m_private->m_resourceResponse->setURL(url);
}
+unsigned WebURLResponse::connectionID() const
+{
+ return m_private->m_resourceResponse->connectionID();
+}
+
+void WebURLResponse::setConnectionID(unsigned connectionID)
+{
+ m_private->m_resourceResponse->setConnectionID(connectionID);
+}
+
+bool WebURLResponse::connectionReused() const
+{
+ return m_private->m_resourceResponse->connectionReused();
+}
+
+void WebURLResponse::setConnectionReused(bool connectionReused)
+{
+ m_private->m_resourceResponse->setConnectionReused(connectionReused);
+}
+
+WebURLLoadTiming WebURLResponse::loadTiming()
+{
+ return WebURLLoadTiming(m_private->m_resourceResponse->resourceLoadTiming());
+}
+
+void WebURLResponse::setLoadTiming(const WebURLLoadTiming& timing)
+{
+ RefPtr<ResourceLoadTiming> loadTiming = PassRefPtr<ResourceLoadTiming>(timing);
+ m_private->m_resourceResponse->setResourceLoadTiming(loadTiming.release());
+}
+
+WebHTTPLoadInfo WebURLResponse::httpLoadInfo()
+{
+ return WebHTTPLoadInfo(m_private->m_resourceResponse->resourceLoadInfo());
+}
+
+void WebURLResponse::setHTTPLoadInfo(const WebHTTPLoadInfo& value)
+{
+ m_private->m_resourceResponse->setResourceLoadInfo(value);
+}
+
+double WebURLResponse::responseTime() const
+{
+ return m_private->m_resourceResponse->responseTime();
+}
+
+void WebURLResponse::setResponseTime(double responseTime)
+{
+ m_private->m_resourceResponse->setResponseTime(responseTime);
+}
+
WebString WebURLResponse::mimeType() const
{
return m_private->m_resourceResponse->mimeType();
@@ -165,6 +222,8 @@ void WebURLResponse::setHTTPHeaderField(const WebString& name, const WebString&
void WebURLResponse::addHTTPHeaderField(const WebString& name, const WebString& value)
{
+ if (name.isNull() || value.isNull())
+ return;
// FIXME: Add an addHTTPHeaderField method to ResourceResponse.
const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields();
String valueStr(value);
@@ -255,6 +314,16 @@ const ResourceResponse& WebURLResponse::toResourceResponse() const
return *m_private->m_resourceResponse;
}
+bool WebURLResponse::wasCached() const
+{
+ return m_private->m_resourceResponse->wasCached();
+}
+
+void WebURLResponse::setWasCached(bool value)
+{
+ m_private->m_resourceResponse->setWasCached(value);
+}
+
bool WebURLResponse::wasFetchedViaSPDY() const
{
return m_private->m_resourceResponse->wasFetchedViaSPDY();
@@ -265,6 +334,56 @@ void WebURLResponse::setWasFetchedViaSPDY(bool value)
m_private->m_resourceResponse->setWasFetchedViaSPDY(value);
}
+bool WebURLResponse::wasNpnNegotiated() const
+{
+ return m_private->m_resourceResponse->wasNpnNegotiated();
+}
+
+void WebURLResponse::setWasNpnNegotiated(bool value)
+{
+ m_private->m_resourceResponse->setWasNpnNegotiated(value);
+}
+
+bool WebURLResponse::wasAlternateProtocolAvailable() const
+{
+ return m_private->m_resourceResponse->wasAlternateProtocolAvailable();
+}
+
+void WebURLResponse::setWasAlternateProtocolAvailable(bool value)
+{
+ m_private->m_resourceResponse->setWasAlternateProtocolAvailable(value);
+}
+
+bool WebURLResponse::wasFetchedViaProxy() const
+{
+ return m_private->m_resourceResponse->wasFetchedViaProxy();
+}
+
+void WebURLResponse::setWasFetchedViaProxy(bool value)
+{
+ m_private->m_resourceResponse->setWasFetchedViaProxy(value);
+}
+
+bool WebURLResponse::isMultipartPayload() const
+{
+ return m_private->m_resourceResponse->isMultipartPayload();
+}
+
+void WebURLResponse::setIsMultipartPayload(bool value)
+{
+ m_private->m_resourceResponse->setIsMultipartPayload(value);
+}
+
+WebString WebURLResponse::downloadFilePath() const
+{
+ return m_private->m_downloadFilePath;
+}
+
+void WebURLResponse::setDownloadFilePath(const WebString& downloadFilePath)
+{
+ m_private->m_downloadFilePath = downloadFilePath;
+}
+
void WebURLResponse::assign(WebURLResponsePrivate* p)
{
// Subclasses may call this directly so a self-assignment check is needed
diff --git a/WebKit/chromium/src/WebURLResponsePrivate.h b/WebKit/chromium/src/WebURLResponsePrivate.h
index 716c8db..dc5ce22 100644
--- a/WebKit/chromium/src/WebURLResponsePrivate.h
+++ b/WebKit/chromium/src/WebURLResponsePrivate.h
@@ -31,6 +31,8 @@
#ifndef WebURLResponsePrivate_h
#define WebURLResponsePrivate_h
+#include "WebString.h"
+
namespace WebCore { class ResourceResponse; }
namespace WebKit {
@@ -43,6 +45,9 @@ public:
virtual void dispose() = 0;
WebCore::ResourceResponse* m_resourceResponse;
+
+ // FIXME: Move this to ResourceResponse once we have an internal consumer.
+ WebString m_downloadFilePath;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebViewImpl.cpp b/WebKit/chromium/src/WebViewImpl.cpp
index ce03523..7bec254 100644
--- a/WebKit/chromium/src/WebViewImpl.cpp
+++ b/WebKit/chromium/src/WebViewImpl.cpp
@@ -32,35 +32,44 @@
#include "WebViewImpl.h"
#include "AutoFillPopupMenuClient.h"
-#include "AutocompletePopupMenuClient.h"
#include "AXObjectCache.h"
+#include "BackForwardListImpl.h"
#include "Chrome.h"
+#include "ChromiumBridge.h"
+#include "ColorSpace.h"
+#include "CompositionUnderlineVectorBuilder.h"
#include "ContextMenu.h"
#include "ContextMenuController.h"
#include "ContextMenuItem.h"
#include "CSSStyleSelector.h"
#include "CSSValueKeywords.h"
#include "Cursor.h"
+#include "DeviceOrientationClientProxy.h"
#include "Document.h"
#include "DocumentLoader.h"
#include "DOMUtilitiesPrivate.h"
#include "DragController.h"
+#include "DragScrollTimer.h"
#include "DragData.h"
#include "Editor.h"
#include "EventHandler.h"
+#include "Extensions3D.h"
#include "FocusController.h"
#include "FontDescription.h"
#include "FrameLoader.h"
#include "FrameTree.h"
#include "FrameView.h"
#include "GraphicsContext.h"
-#include "HitTestResult.h"
+#include "GraphicsContext3D.h"
+#include "GraphicsContext3DInternal.h"
#include "HTMLInputElement.h"
#include "HTMLMediaElement.h"
+#include "HitTestResult.h"
#include "HTMLNames.h"
#include "Image.h"
+#include "ImageBuffer.h"
+#include "ImageData.h"
#include "InspectorController.h"
-#include "IntRect.h"
#include "KeyboardCodes.h"
#include "KeyboardEvent.h"
#include "MIMETypeRegistry.h"
@@ -72,8 +81,8 @@
#include "PlatformContextSkia.h"
#include "PlatformKeyboardEvent.h"
#include "PlatformMouseEvent.h"
+#include "PlatformThemeChromiumGtk.h"
#include "PlatformWheelEvent.h"
-#include "PluginInfoStore.h"
#include "PopupMenuChromium.h"
#include "PopupMenuClient.h"
#include "ProgressTracker.h"
@@ -82,31 +91,46 @@
#include "SecurityOrigin.h"
#include "SelectionController.h"
#include "Settings.h"
+#include "SpeechInputClientImpl.h"
+#include "Timer.h"
#include "TypingCommand.h"
+#include "UserGestureIndicator.h"
+#include "Vector.h"
#include "WebAccessibilityObject.h"
#include "WebDevToolsAgentPrivate.h"
+#include "WebDevToolsAgentImpl.h"
#include "WebDragData.h"
#include "WebFrameImpl.h"
+#include "WebImage.h"
+#include "WebInputElement.h"
#include "WebInputEvent.h"
#include "WebInputEventConversion.h"
+#include "WebKit.h"
+#include "WebKitClient.h"
#include "WebMediaPlayerAction.h"
#include "WebNode.h"
+#include "WebPlugin.h"
+#include "WebPluginContainerImpl.h"
#include "WebPoint.h"
#include "WebPopupMenuImpl.h"
#include "WebRect.h"
+#include "WebRuntimeFeatures.h"
#include "WebSettingsImpl.h"
#include "WebString.h"
#include "WebVector.h"
#include "WebViewClient.h"
+#include <wtf/RefPtr.h>
+
+#if PLATFORM(CG)
+#include <CoreGraphics/CGContext.h>
+#endif
#if OS(WINDOWS)
-#include "KeyboardCodesWin.h"
#include "RenderThemeChromiumWin.h"
#else
-#if OS(LINUX)
+#if OS(LINUX) || OS(FREEBSD)
#include "RenderThemeChromiumLinux.h"
#endif
-#include "KeyboardCodesPosix.h"
#include "RenderTheme.h"
#endif
@@ -116,15 +140,37 @@
using namespace WebCore;
+namespace {
+
+GraphicsContext3D::Attributes getCompositorContextAttributes()
+{
+ // Explicitly disable antialiasing for the compositor. As of the time of
+ // this writing, the only platform that supported antialiasing for the
+ // compositor was Mac OS X, because the on-screen OpenGL context creation
+ // code paths on Windows and Linux didn't yet have multisampling support.
+ // Mac OS X essentially always behaves as though it's rendering offscreen.
+ // Multisampling has a heavy cost especially on devices with relatively low
+ // fill rate like most notebooks, and the Mac implementation would need to
+ // be optimized to resolve directly into the IOSurface shared between the
+ // GPU and browser processes. For these reasons and to avoid platform
+ // disparities we explicitly disable antialiasing.
+ GraphicsContext3D::Attributes attributes;
+ attributes.antialias = false;
+ return attributes;
+}
+
+} // anonymous namespace
+
namespace WebKit {
// Change the text zoom level by kTextSizeMultiplierRatio each time the user
// zooms text in or out (ie., change by 20%). The min and max values limit
// text zoom to half and 3x the original text size. These three values match
// those in Apple's port in WebKit/WebKit/WebView/WebView.mm
-static const double textSizeMultiplierRatio = 1.2;
-static const double minTextSizeMultiplier = 0.5;
-static const double maxTextSizeMultiplier = 3.0;
+const double WebView::textSizeMultiplierRatio = 1.2;
+const double WebView::minTextSizeMultiplier = 0.5;
+const double WebView::maxTextSizeMultiplier = 3.0;
+
// The group name identifies a namespace of pages. Page group is used on OSX
// for some programs that use HTML views to display things that don't seem like
@@ -133,8 +179,8 @@ static const double maxTextSizeMultiplier = 3.0;
const char* pageGroupName = "default";
// Used to defer all page activity in cases where the embedder wishes to run
-// a nested event loop.
-static PageGroupLoadDeferrer* pageGroupLoadDeferrer;
+// a nested event loop. Using a stack enables nesting of message loop invocations.
+static Vector<PageGroupLoadDeferrer*> pageGroupLoadDeferrerStack;
// Ensure that the WebDragOperation enum values stay in sync with the original
// DragOperation constants.
@@ -149,26 +195,34 @@ COMPILE_ASSERT_MATCHING_ENUM(DragOperationMove);
COMPILE_ASSERT_MATCHING_ENUM(DragOperationDelete);
COMPILE_ASSERT_MATCHING_ENUM(DragOperationEvery);
-// Note that focusOnShow is false so that the suggestions popup is shown not
-// activated. We need the page to still have focus so the user can keep typing
-// while the popup is showing.
-static const PopupContainerSettings suggestionsPopupSettings = {
- false, // focusOnShow
- false, // setTextOnIndexChange
- false, // acceptOnAbandon
- true, // loopSelectionNavigation
- true, // restrictWidthOfListBox. Same as other browser (Fx, IE, and safari)
+static const PopupContainerSettings autoFillPopupSettings = {
+ false, // setTextOnIndexChange
+ false, // acceptOnAbandon
+ true, // loopSelectionNavigation
+ false, // restrictWidthOfListBox (For security reasons show the entire entry
+ // so the user doesn't enter information he did not intend to.)
// For suggestions, we use the direction of the input field as the direction
// of the popup items. The main reason is to keep the display of items in
// drop-down the same as the items in the input field.
PopupContainerSettings::DOMElementDirection,
};
+static bool shouldUseExternalPopupMenus = false;
+
// WebView ----------------------------------------------------------------
-WebView* WebView::create(WebViewClient* client)
+WebView* WebView::create(WebViewClient* client, WebDevToolsAgentClient* devToolsClient)
+{
+ // Keep runtime flag for device motion turned off until it's implemented.
+ WebRuntimeFeatures::enableDeviceMotion(false);
+
+ // Pass the WebViewImpl's self-reference to the caller.
+ return adoptRef(new WebViewImpl(client, devToolsClient)).leakRef();
+}
+
+void WebView::setUseExternalPopupMenus(bool useExternalPopupMenus)
{
- return new WebViewImpl(client);
+ shouldUseExternalPopupMenus = useExternalPopupMenus;
}
void WebView::updateVisitedLinkState(unsigned long long linkHash)
@@ -183,24 +237,23 @@ void WebView::resetVisitedLinkState()
void WebView::willEnterModalLoop()
{
- // It is not valid to nest more than once.
- ASSERT(!pageGroupLoadDeferrer);
-
PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName);
ASSERT(pageGroup);
- ASSERT(!pageGroup->pages().isEmpty());
- // Pick any page in the page group since we are deferring all pages.
- pageGroupLoadDeferrer = new PageGroupLoadDeferrer(*pageGroup->pages().begin(), true);
+ if (pageGroup->pages().isEmpty())
+ pageGroupLoadDeferrerStack.append(static_cast<PageGroupLoadDeferrer*>(0));
+ else {
+ // Pick any page in the page group since we are deferring all pages.
+ pageGroupLoadDeferrerStack.append(new PageGroupLoadDeferrer(*pageGroup->pages().begin(), true));
+ }
}
void WebView::didExitModalLoop()
{
- // The embedder must have called willEnterNestedEventLoop.
- ASSERT(pageGroupLoadDeferrer);
+ ASSERT(pageGroupLoadDeferrerStack.size());
- delete pageGroupLoadDeferrer;
- pageGroupLoadDeferrer = 0;
+ delete pageGroupLoadDeferrerStack.last();
+ pageGroupLoadDeferrerStack.removeLast();
}
void WebViewImpl::initializeMainFrame(WebFrameClient* frameClient)
@@ -216,7 +269,7 @@ void WebViewImpl::initializeMainFrame(WebFrameClient* frameClient)
SecurityOrigin::setLocalLoadPolicy(SecurityOrigin::AllowLocalLoadsForLocalOnly);
}
-WebViewImpl::WebViewImpl(WebViewClient* client)
+WebViewImpl::WebViewImpl(WebViewClient* client, WebDevToolsAgentClient* devToolsClient)
: m_client(client)
, m_backForwardListClientImpl(this)
, m_chromeClientImpl(this)
@@ -229,6 +282,8 @@ WebViewImpl::WebViewImpl(WebViewClient* client)
, m_newNavigationLoader(0)
#endif
, m_zoomLevel(0)
+ , m_minimumZoomLevel(zoomFactorToZoomLevel(minTextSizeMultiplier))
+ , m_maximumZoomLevel(zoomFactorToZoomLevel(maxTextSizeMultiplier))
, m_contextMenuAllowed(false)
, m_doingDragAndDrop(false)
, m_ignoreInputEvents(false)
@@ -240,31 +295,51 @@ WebViewImpl::WebViewImpl(WebViewClient* client)
, m_dropEffect(DropEffectDefault)
, m_operationsAllowed(WebDragOperationNone)
, m_dragOperation(WebDragOperationNone)
- , m_suggestionsPopupShowing(false)
- , m_suggestionsPopupClient(0)
- , m_suggestionsPopup(0)
+ , m_autoFillPopupShowing(false)
+ , m_autoFillPopupClient(0)
+ , m_autoFillPopup(0)
, m_isTransparent(false)
, m_tabsToLinks(false)
+ , m_dragScrollTimer(new DragScrollTimer())
+#if USE(ACCELERATED_COMPOSITING)
+ , m_layerRenderer(0)
+ , m_isAcceleratedCompositingActive(false)
+ , m_compositorCreationFailed(false)
+#endif
+#if ENABLE(INPUT_SPEECH)
+ , m_speechInputClient(SpeechInputClientImpl::create(client))
+#endif
+ , m_deviceOrientationClientProxy(new DeviceOrientationClientProxy(client ? client->deviceOrientationClient() : 0))
{
// WebKit/win/WebView.cpp does the same thing, except they call the
// KJS specific wrapper around this method. We need to have threading
// initialized because CollatorICU requires it.
WTF::initializeThreading();
+ WTF::initializeMainThread();
// set to impossible point so we always get the first mouse pos
m_lastMousePosition = WebPoint(-1, -1);
- // the page will take ownership of the various clients
- m_page.set(new Page(&m_chromeClientImpl,
- &m_contextMenuClientImpl,
- &m_editorClientImpl,
- &m_dragClientImpl,
- &m_inspectorClientImpl,
- 0,
- 0));
+ if (devToolsClient)
+ m_devToolsAgent = new WebDevToolsAgentImpl(this, devToolsClient);
+
+ Page::PageClients pageClients;
+ pageClients.chromeClient = &m_chromeClientImpl;
+ pageClients.contextMenuClient = &m_contextMenuClientImpl;
+ pageClients.editorClient = &m_editorClientImpl;
+ pageClients.dragClient = &m_dragClientImpl;
+ pageClients.inspectorClient = &m_inspectorClientImpl;
+#if ENABLE(INPUT_SPEECH)
+ pageClients.speechInputClient = m_speechInputClient.get();
+#endif
+ pageClients.deviceOrientationClient = m_deviceOrientationClientProxy.get();
+
+ m_page.set(new Page(pageClients));
- m_page->backForwardList()->setClient(&m_backForwardListClientImpl);
+ static_cast<BackForwardListImpl*>(m_page->backForwardList())->setClient(&m_backForwardListClientImpl);
m_page->setGroupName(pageGroupName);
+
+ m_inspectorSettingsMap.set(new SettingsMap);
}
WebViewImpl::~WebViewImpl()
@@ -326,19 +401,34 @@ void WebViewImpl::mouseDown(const WebMouseEvent& event)
if (!mainFrameImpl() || !mainFrameImpl()->frameView())
return;
+ // If there is a select popup open, close it as the user is clicking on
+ // the page (outside of the popup). We also save it so we can prevent a
+ // click on the select element from immediately reopening the popup.
+ RefPtr<WebCore::PopupContainer> selectPopup;
+ if (event.button == WebMouseEvent::ButtonLeft) {
+ selectPopup = m_selectPopup;
+ hideSelectPopup();
+ ASSERT(!m_selectPopup);
+ }
+
m_lastMouseDownPoint = WebPoint(event.x, event.y);
- // If a text field that has focus is clicked again, we should display the
- // suggestions popup.
RefPtr<Node> clickedNode;
if (event.button == WebMouseEvent::ButtonLeft) {
+ IntPoint point(event.x, event.y);
+ point = m_page->mainFrame()->view()->windowToContents(point);
+ HitTestResult result(m_page->mainFrame()->eventHandler()->hitTestResultAtPoint(point, false));
+ Node* hitNode = result.innerNonSharedNode();
+
+ // Take capture on a mouse down on a plugin so we can send it mouse events.
+ if (hitNode && hitNode->renderer() && hitNode->renderer()->isEmbeddedObject())
+ m_mouseCaptureNode = hitNode;
+
+ // If a text field that has focus is clicked again, we should display the
+ // AutoFill popup.
RefPtr<Node> focusedNode = focusedWebCoreNode();
if (focusedNode.get() && toHTMLInputElement(focusedNode.get())) {
- IntPoint point(event.x, event.y);
- point = m_page->mainFrame()->view()->windowToContents(point);
- HitTestResult result(point);
- result = m_page->mainFrame()->eventHandler()->hitTestResultAtPoint(point, false);
- if (result.innerNonSharedNode() == focusedNode) {
+ if (hitNode == focusedNode) {
// Already focused text field was clicked, let's remember this. If
// focus has not changed after the mouse event is processed, we'll
// trigger the autocomplete.
@@ -347,14 +437,23 @@ void WebViewImpl::mouseDown(const WebMouseEvent& event)
}
}
+ mainFrameImpl()->frame()->loader()->resetMultipleFormSubmissionProtection();
+
mainFrameImpl()->frame()->eventHandler()->handleMousePressEvent(
PlatformMouseEventBuilder(mainFrameImpl()->frameView(), event));
if (clickedNode.get() && clickedNode == focusedWebCoreNode()) {
- // Focus has not changed, show the suggestions popup.
+ // Focus has not changed, show the AutoFill popup.
static_cast<EditorClientImpl*>(m_page->editorClient())->
showFormAutofillForNode(clickedNode.get());
}
+ if (m_selectPopup && m_selectPopup == selectPopup) {
+ // That click triggered a select popup which is the same as the one that
+ // was showing before the click. It means the user clicked the select
+ // while the popup was showing, and as a result we first closed then
+ // immediately reopened the select popup. It needs to be closed.
+ hideSelectPopup();
+ }
// Dispatch the contextmenu event regardless of if the click was swallowed.
// On Windows, we handle it on mouse up, not down.
@@ -363,7 +462,7 @@ void WebViewImpl::mouseDown(const WebMouseEvent& event)
|| (event.button == WebMouseEvent::ButtonLeft
&& event.modifiers & WebMouseEvent::ControlKey))
mouseContextMenu(event);
-#elif OS(LINUX)
+#elif OS(LINUX) || OS(FREEBSD)
if (event.button == WebMouseEvent::ButtonRight)
mouseContextMenu(event);
#endif
@@ -402,7 +501,7 @@ void WebViewImpl::mouseUp(const WebMouseEvent& event)
if (!mainFrameImpl() || !mainFrameImpl()->frameView())
return;
-#if OS(LINUX)
+#if OS(LINUX) || OS(FREEBSD)
// If the event was a middle click, attempt to copy text into the focused
// frame. We execute this before we let the page have a go at the event
// because the page may change what is focused during in its event handler.
@@ -426,7 +525,7 @@ void WebViewImpl::mouseUp(const WebMouseEvent& event)
IntPoint contentPoint = view->windowToContents(clickPoint);
HitTestResult hitTestResult = focused->eventHandler()->hitTestResultAtPoint(contentPoint, false, false, ShouldHitTestScrollbars);
// We don't want to send a paste when middle clicking a scroll bar or a
- // link (which will navigate later in the code). The main scrollbars
+ // link (which will navigate later in the code). The main scrollbars
// have to be handled separately.
if (!hitTestResult.scrollbar() && !hitTestResult.isLiveLink() && focused && !view->scrollbarAtPoint(clickPoint)) {
Editor* editor = focused->editor();
@@ -439,7 +538,6 @@ void WebViewImpl::mouseUp(const WebMouseEvent& event)
}
#endif
- mouseCaptureLost();
mainFrameImpl()->frame()->eventHandler()->handleMouseReleaseEvent(
PlatformMouseEventBuilder(mainFrameImpl()->frameView(), event));
@@ -451,10 +549,10 @@ void WebViewImpl::mouseUp(const WebMouseEvent& event)
#endif
}
-void WebViewImpl::mouseWheel(const WebMouseWheelEvent& event)
+bool WebViewImpl::mouseWheel(const WebMouseWheelEvent& event)
{
PlatformWheelEventBuilder platformEvent(mainFrameImpl()->frameView(), event);
- mainFrameImpl()->frame()->eventHandler()->handleWheelEvent(platformEvent);
+ return mainFrameImpl()->frame()->eventHandler()->handleWheelEvent(platformEvent);
}
bool WebViewImpl::keyEvent(const WebKeyboardEvent& event)
@@ -471,6 +569,10 @@ bool WebViewImpl::keyEvent(const WebKeyboardEvent& event)
// event.
m_suppressNextKeypressEvent = false;
+ // Give any select popup a chance at consuming the key event.
+ if (selectPopupHandleKeyEvent(event))
+ return true;
+
// Give Autocomplete a chance to consume the key events it is interested in.
if (autocompleteHandleKeyEvent(event))
return true;
@@ -483,21 +585,21 @@ bool WebViewImpl::keyEvent(const WebKeyboardEvent& event)
if (!handler)
return keyEventDefault(event);
-#if OS(WINDOWS) || OS(LINUX)
+#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD)
const WebInputEvent::Type contextMenuTriggeringEventType =
#if OS(WINDOWS)
WebInputEvent::KeyUp;
-#elif OS(LINUX)
+#elif OS(LINUX) || OS(FREEBSD)
WebInputEvent::RawKeyDown;
#endif
- if (((!event.modifiers && (event.windowsKeyCode == VKEY_APPS))
- || ((event.modifiers == WebInputEvent::ShiftKey) && (event.windowsKeyCode == VKEY_F10)))
- && event.type == contextMenuTriggeringEventType) {
+ bool isUnmodifiedMenuKey = !(event.modifiers & WebInputEvent::InputModifiers) && event.windowsKeyCode == VKEY_APPS;
+ bool isShiftF10 = event.modifiers == WebInputEvent::ShiftKey && event.windowsKeyCode == VKEY_F10;
+ if ((isUnmodifiedMenuKey || isShiftF10) && event.type == contextMenuTriggeringEventType) {
sendContextMenuEvent(event);
return true;
}
-#endif
+#endif // OS(WINDOWS) || OS(LINUX) || OS(FREEBSD)
// It's not clear if we should continue after detecting a capslock keypress.
// I'll err on the side of continuing, which is the pre-existing behaviour.
@@ -507,17 +609,30 @@ bool WebViewImpl::keyEvent(const WebKeyboardEvent& event)
PlatformKeyboardEventBuilder evt(event);
if (handler->keyEvent(evt)) {
- if (WebInputEvent::RawKeyDown == event.type)
- m_suppressNextKeypressEvent = true;
+ if (WebInputEvent::RawKeyDown == event.type) {
+ // Suppress the next keypress event unless the focused node is a plug-in node.
+ // (Flash needs these keypress events to handle non-US keyboards.)
+ Node* node = frame->document()->focusedNode();
+ if (!node || !node->renderer() || !node->renderer()->isEmbeddedObject())
+ m_suppressNextKeypressEvent = true;
+ }
return true;
}
return keyEventDefault(event);
}
+bool WebViewImpl::selectPopupHandleKeyEvent(const WebKeyboardEvent& event)
+{
+ if (!m_selectPopup)
+ return false;
+
+ return m_selectPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event));
+}
+
bool WebViewImpl::autocompleteHandleKeyEvent(const WebKeyboardEvent& event)
{
- if (!m_suggestionsPopupShowing
+ if (!m_autoFillPopupShowing
// Home and End should be left to the text field to process.
|| event.windowsKeyCode == VKEY_HOME
|| event.windowsKeyCode == VKEY_END)
@@ -525,7 +640,7 @@ bool WebViewImpl::autocompleteHandleKeyEvent(const WebKeyboardEvent& event)
// Pressing delete triggers the removal of the selected suggestion from the DB.
if (event.windowsKeyCode == VKEY_DELETE
- && m_suggestionsPopup->selectedIndex() != -1) {
+ && m_autoFillPopup->selectedIndex() != -1) {
Node* node = focusedWebCoreNode();
if (!node || (node->nodeType() != Node::ELEMENT_NODE)) {
ASSERT_NOT_REACHED();
@@ -537,22 +652,25 @@ bool WebViewImpl::autocompleteHandleKeyEvent(const WebKeyboardEvent& event)
return false;
}
- int selectedIndex = m_suggestionsPopup->selectedIndex();
- HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(element);
- WebString name = inputElement->name();
- WebString value = m_autocompletePopupClient->itemText(selectedIndex);
+ int selectedIndex = m_autoFillPopup->selectedIndex();
+
+ if (!m_autoFillPopupClient->canRemoveSuggestionAtIndex(selectedIndex))
+ return false;
+
+ WebString name = WebInputElement(static_cast<HTMLInputElement*>(element)).nameForAutofill();
+ WebString value = m_autoFillPopupClient->itemText(selectedIndex);
m_client->removeAutofillSuggestions(name, value);
// Update the entries in the currently showing popup to reflect the
// deletion.
- m_autocompletePopupClient->removeSuggestionAtIndex(selectedIndex);
- refreshSuggestionsPopup();
+ m_autoFillPopupClient->removeSuggestionAtIndex(selectedIndex);
+ refreshAutoFillPopup();
return false;
}
- if (!m_suggestionsPopup->isInterestedInEventForKey(event.windowsKeyCode))
+ if (!m_autoFillPopup->isInterestedInEventForKey(event.windowsKeyCode))
return false;
- if (m_suggestionsPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event))) {
+ if (m_autoFillPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event))) {
// We need to ignore the next Char event after this otherwise pressing
// enter when selecting an item in the menu will go to the page.
if (WebInputEvent::RawKeyDown == event.type)
@@ -604,62 +722,21 @@ bool WebViewImpl::charEvent(const WebKeyboardEvent& event)
return true;
}
-// The WebViewImpl::SendContextMenuEvent function is based on the Webkit
-// function
-// bool WebView::handleContextMenuEvent(WPARAM wParam, LPARAM lParam) in
-// webkit\webkit\win\WebView.cpp. The only significant change in this
-// function is the code to convert from a Keyboard event to the Right
-// Mouse button up event.
-//
-// This function is an ugly copy/paste and should be cleaned up when the
-// WebKitWin version is cleaned: https://bugs.webkit.org/show_bug.cgi?id=20438
-#if OS(WINDOWS) || OS(LINUX)
-// FIXME: implement on Mac
-bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event)
+#if ENABLE(TOUCH_EVENTS)
+bool WebViewImpl::touchEvent(const WebTouchEvent& event)
{
- static const int kContextMenuMargin = 1;
- Frame* mainFrameImpl = page()->mainFrame();
- FrameView* view = mainFrameImpl->view();
- if (!view)
+ if (!mainFrameImpl() || !mainFrameImpl()->frameView())
return false;
- IntPoint coords(-1, -1);
-#if OS(WINDOWS)
- int rightAligned = ::GetSystemMetrics(SM_MENUDROPALIGNMENT);
-#else
- int rightAligned = 0;
+ PlatformTouchEventBuilder touchEventBuilder(mainFrameImpl()->frameView(), event);
+ return mainFrameImpl()->frame()->eventHandler()->handleTouchEvent(touchEventBuilder);
+}
#endif
- IntPoint location;
-
-
- Frame* focusedFrame = page()->focusController()->focusedOrMainFrame();
- Node* focusedNode = focusedFrame->document()->focusedNode();
- Position start = mainFrameImpl->selection()->selection().start();
-
- if (focusedFrame->editor() && focusedFrame->editor()->canEdit() && start.node()) {
- RenderObject* renderer = start.node()->renderer();
- if (!renderer)
- return false;
-
- RefPtr<Range> selection = mainFrameImpl->selection()->toNormalizedRange();
- IntRect firstRect = mainFrameImpl->firstRectForRange(selection.get());
-
- int x = rightAligned ? firstRect.right() : firstRect.x();
- location = IntPoint(x, firstRect.bottom());
- } else if (focusedNode)
- location = focusedNode->getRect().bottomLeft();
- else {
- location = IntPoint(
- rightAligned ? view->contentsWidth() - kContextMenuMargin : kContextMenuMargin,
- kContextMenuMargin);
- }
-
- location = view->contentsToWindow(location);
- // FIXME: The IntSize(0, -1) is a hack to get the hit-testing to result in
- // the selected element. Ideally we'd have the position of a context menu
- // event be separate from its target node.
- coords = location + IntSize(0, -1);
+#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD)
+// Mac has no way to open a context menu based on a keyboard event.
+bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event)
+{
// The contextMenuController() holds onto the last context menu that was
// popped up on the page until a new one is created. We need to clear
// this menu before propagating the event through the DOM so that we can
@@ -668,17 +745,9 @@ bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event)
// not run.
page()->contextMenuController()->clearContextMenu();
- focusedFrame->view()->setCursor(pointerCursor());
- WebMouseEvent mouseEvent;
- mouseEvent.button = WebMouseEvent::ButtonRight;
- mouseEvent.x = coords.x();
- mouseEvent.y = coords.y();
- mouseEvent.type = WebInputEvent::MouseUp;
-
- PlatformMouseEventBuilder platformEvent(view, mouseEvent);
-
m_contextMenuAllowed = true;
- bool handled = focusedFrame->eventHandler()->sendContextMenuEvent(platformEvent);
+ Frame* focusedFrame = page()->focusController()->focusedOrMainFrame();
+ bool handled = focusedFrame->eventHandler()->sendContextMenuEventForKey();
m_contextMenuAllowed = false;
return handled;
}
@@ -733,45 +802,59 @@ bool WebViewImpl::scrollViewWithKeyboard(int keyCode, int modifiers)
{
ScrollDirection scrollDirection;
ScrollGranularity scrollGranularity;
+ if (!mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity))
+ return false;
+ return propagateScroll(scrollDirection, scrollGranularity);
+}
+bool WebViewImpl::mapKeyCodeForScroll(int keyCode,
+ WebCore::ScrollDirection* scrollDirection,
+ WebCore::ScrollGranularity* scrollGranularity)
+{
switch (keyCode) {
case VKEY_LEFT:
- scrollDirection = ScrollLeft;
- scrollGranularity = ScrollByLine;
+ *scrollDirection = ScrollLeft;
+ *scrollGranularity = ScrollByLine;
break;
case VKEY_RIGHT:
- scrollDirection = ScrollRight;
- scrollGranularity = ScrollByLine;
+ *scrollDirection = ScrollRight;
+ *scrollGranularity = ScrollByLine;
break;
case VKEY_UP:
- scrollDirection = ScrollUp;
- scrollGranularity = ScrollByLine;
+ *scrollDirection = ScrollUp;
+ *scrollGranularity = ScrollByLine;
break;
case VKEY_DOWN:
- scrollDirection = ScrollDown;
- scrollGranularity = ScrollByLine;
+ *scrollDirection = ScrollDown;
+ *scrollGranularity = ScrollByLine;
break;
case VKEY_HOME:
- scrollDirection = ScrollUp;
- scrollGranularity = ScrollByDocument;
+ *scrollDirection = ScrollUp;
+ *scrollGranularity = ScrollByDocument;
break;
case VKEY_END:
- scrollDirection = ScrollDown;
- scrollGranularity = ScrollByDocument;
+ *scrollDirection = ScrollDown;
+ *scrollGranularity = ScrollByDocument;
break;
case VKEY_PRIOR: // page up
- scrollDirection = ScrollUp;
- scrollGranularity = ScrollByPage;
+ *scrollDirection = ScrollUp;
+ *scrollGranularity = ScrollByPage;
break;
case VKEY_NEXT: // page down
- scrollDirection = ScrollDown;
- scrollGranularity = ScrollByPage;
+ *scrollDirection = ScrollDown;
+ *scrollGranularity = ScrollByPage;
break;
default:
return false;
}
- return propagateScroll(scrollDirection, scrollGranularity);
+ return true;
+}
+
+void WebViewImpl::hideSelectPopup()
+{
+ if (m_selectPopup.get())
+ m_selectPopup->hidePopup();
}
bool WebViewImpl::propagateScroll(ScrollDirection scrollDirection,
@@ -781,18 +864,39 @@ bool WebViewImpl::propagateScroll(ScrollDirection scrollDirection,
if (!frame)
return false;
- bool scrollHandled =
- frame->eventHandler()->scrollOverflow(scrollDirection,
- scrollGranularity);
+ bool scrollHandled = frame->eventHandler()->scrollOverflow(scrollDirection, scrollGranularity);
Frame* currentFrame = frame;
while (!scrollHandled && currentFrame) {
- scrollHandled = currentFrame->view()->scroll(scrollDirection,
- scrollGranularity);
+ scrollHandled = currentFrame->view()->scroll(scrollDirection, scrollGranularity);
currentFrame = currentFrame->tree()->parent();
}
return scrollHandled;
}
+void WebViewImpl::popupOpened(WebCore::PopupContainer* popupContainer)
+{
+ if (popupContainer->popupType() == WebCore::PopupContainer::Select) {
+ ASSERT(!m_selectPopup);
+ m_selectPopup = popupContainer;
+ }
+}
+
+void WebViewImpl::popupClosed(WebCore::PopupContainer* popupContainer)
+{
+ if (popupContainer->popupType() == WebCore::PopupContainer::Select) {
+ ASSERT(m_selectPopup.get());
+ m_selectPopup = 0;
+ }
+}
+
+void WebViewImpl::hideAutoFillPopup()
+{
+ if (m_autoFillPopupShowing) {
+ m_autoFillPopup->hidePopup();
+ m_autoFillPopupShowing = false;
+ }
+}
+
Frame* WebViewImpl::focusedWebCoreFrame()
{
return m_page.get() ? m_page->focusController()->focusedOrMainFrame() : 0;
@@ -846,8 +950,20 @@ void WebViewImpl::resize(const WebSize& newSize)
if (m_client) {
WebRect damagedRect(0, 0, m_size.width, m_size.height);
- m_client->didInvalidateRect(damagedRect);
+ if (isAcceleratedCompositingActive()) {
+#if USE(ACCELERATED_COMPOSITING)
+ invalidateRootLayerRect(damagedRect);
+#endif
+ } else
+ m_client->didInvalidateRect(damagedRect);
+ }
+
+#if USE(ACCELERATED_COMPOSITING)
+ if (m_layerRenderer && isAcceleratedCompositingActive()) {
+ m_layerRenderer->resizeOnscreenContent(IntSize(std::max(1, m_size.width),
+ std::max(1, m_size.height)));
}
+#endif
}
void WebViewImpl::layout()
@@ -871,19 +987,99 @@ void WebViewImpl::layout()
}
}
+#if USE(ACCELERATED_COMPOSITING)
+void WebViewImpl::doPixelReadbackToCanvas(WebCanvas* canvas, const IntRect& rect)
+{
+ ASSERT(rect.right() <= m_layerRenderer->rootLayerTextureSize().width()
+ && rect.bottom() <= m_layerRenderer->rootLayerTextureSize().height());
+
+#if PLATFORM(SKIA)
+ PlatformContextSkia context(canvas);
+
+ // PlatformGraphicsContext is actually a pointer to PlatformContextSkia
+ GraphicsContext gc(reinterpret_cast<PlatformGraphicsContext*>(&context));
+ int bitmapHeight = canvas->getDevice()->accessBitmap(false).height();
+#elif PLATFORM(CG)
+ GraphicsContext gc(canvas);
+ int bitmapHeight = CGBitmapContextGetHeight(reinterpret_cast<CGContextRef>(canvas));
+#else
+ notImplemented();
+#endif
+ // Compute rect to sample from inverted GPU buffer.
+ IntRect invertRect(rect.x(), bitmapHeight - rect.bottom(), rect.width(), rect.height());
+
+ OwnPtr<ImageBuffer> imageBuffer(ImageBuffer::create(rect.size()));
+ RefPtr<ImageData> imageData(ImageData::create(rect.width(), rect.height()));
+ if (imageBuffer.get() && imageData.get()) {
+ m_layerRenderer->getFramebufferPixels(imageData->data()->data()->data(), invertRect);
+ imageBuffer->putPremultipliedImageData(imageData.get(), IntRect(IntPoint(), rect.size()), IntPoint());
+ gc.save();
+ gc.translate(FloatSize(0.0f, bitmapHeight));
+ gc.scale(FloatSize(1.0f, -1.0f));
+ // Use invertRect in next line, so that transform above inverts it back to
+ // desired destination rect.
+ gc.drawImageBuffer(imageBuffer.get(), ColorSpaceDeviceRGB, invertRect.location());
+ gc.restore();
+ }
+}
+#endif
+
void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect)
{
- WebFrameImpl* webframe = mainFrameImpl();
- if (webframe)
- webframe->paint(canvas, rect);
+ if (isAcceleratedCompositingActive()) {
+#if USE(ACCELERATED_COMPOSITING)
+ doComposite();
+
+ // If a canvas was passed in, we use it to grab a copy of the
+ // freshly-rendered pixels.
+ if (canvas) {
+ // Clip rect to the confines of the rootLayerTexture.
+ IntRect resizeRect(rect);
+ resizeRect.intersect(IntRect(IntPoint(), m_layerRenderer->rootLayerTextureSize()));
+ doPixelReadbackToCanvas(canvas, resizeRect);
+ }
+#endif
+ } else {
+ WebFrameImpl* webframe = mainFrameImpl();
+ if (webframe)
+ webframe->paint(canvas, rect);
+ }
+}
+
+void WebViewImpl::themeChanged()
+{
+ if (!page())
+ return;
+ FrameView* view = page()->mainFrame()->view();
+
+ WebRect damagedRect(0, 0, m_size.width, m_size.height);
+ view->invalidateRect(damagedRect);
+}
+
+void WebViewImpl::composite(bool finish)
+{
+#if USE(ACCELERATED_COMPOSITING)
+ doComposite();
+
+ // Finish if requested.
+ if (finish)
+ m_layerRenderer->finish();
+
+ // Put result onscreen.
+ m_layerRenderer->present();
+
+ GraphicsContext3D* context = m_layerRenderer->context();
+ if (context->getExtensions()->getGraphicsResetStatusARB() != GraphicsContext3D::NO_ERROR)
+ reallocateRenderer();
+#endif
}
-// FIXME: m_currentInputEvent should be removed once ChromeClient::show() can
-// get the current-event information from WebCore.
const WebInputEvent* WebViewImpl::m_currentInputEvent = 0;
bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent)
{
+ UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
+
// If we've started a drag and drop operation, ignore input events until
// we're done.
if (m_doingDragAndDrop)
@@ -892,14 +1088,41 @@ bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent)
if (m_ignoreInputEvents)
return true;
- // FIXME: Remove m_currentInputEvent.
- // This only exists to allow ChromeClient::show() to know which mouse button
- // triggered a window.open event.
- // Safari must perform a similar hack, ours is in our WebKit glue layer
- // theirs is in the application. This should go when WebCore can be fixed
- // to pass more event information to ChromeClient::show()
m_currentInputEvent = &inputEvent;
+ if (m_mouseCaptureNode.get() && WebInputEvent::isMouseEventType(inputEvent.type)) {
+ // Save m_mouseCaptureNode since mouseCaptureLost() will clear it.
+ RefPtr<Node> node = m_mouseCaptureNode;
+
+ // Not all platforms call mouseCaptureLost() directly.
+ if (inputEvent.type == WebInputEvent::MouseUp)
+ mouseCaptureLost();
+
+ AtomicString eventType;
+ switch (inputEvent.type) {
+ case WebInputEvent::MouseMove:
+ eventType = eventNames().mousemoveEvent;
+ break;
+ case WebInputEvent::MouseLeave:
+ eventType = eventNames().mouseoutEvent;
+ break;
+ case WebInputEvent::MouseDown:
+ eventType = eventNames().mousedownEvent;
+ break;
+ case WebInputEvent::MouseUp:
+ eventType = eventNames().mouseupEvent;
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+
+ node->dispatchMouseEvent(
+ PlatformMouseEventBuilder(mainFrameImpl()->frameView(), *static_cast<const WebMouseEvent*>(&inputEvent)),
+ eventType, static_cast<const WebMouseEvent*>(&inputEvent)->clickCount);
+ m_currentInputEvent = 0;
+ return true;
+ }
+
bool handled = true;
// FIXME: WebKit seems to always return false on mouse events processing
@@ -915,7 +1138,7 @@ bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent)
break;
case WebInputEvent::MouseWheel:
- mouseWheel(*static_cast<const WebMouseWheelEvent*>(&inputEvent));
+ handled = mouseWheel(*static_cast<const WebMouseWheelEvent*>(&inputEvent));
break;
case WebInputEvent::MouseDown:
@@ -936,6 +1159,15 @@ bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent)
handled = charEvent(*static_cast<const WebKeyboardEvent*>(&inputEvent));
break;
+#if ENABLE(TOUCH_EVENTS)
+ case WebInputEvent::TouchStart:
+ case WebInputEvent::TouchMove:
+ case WebInputEvent::TouchEnd:
+ case WebInputEvent::TouchCancel:
+ handled = touchEvent(*static_cast<const WebTouchEvent*>(&inputEvent));
+ break;
+#endif
+
default:
handled = false;
}
@@ -947,6 +1179,7 @@ bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent)
void WebViewImpl::mouseCaptureLost()
{
+ m_mouseCaptureNode = 0;
}
void WebViewImpl::setFocus(bool enable)
@@ -981,7 +1214,8 @@ void WebViewImpl::setFocus(bool enable)
}
m_imeAcceptEvents = true;
} else {
- hideSuggestionsPopup();
+ hideAutoFillPopup();
+ hideSelectPopup();
// Clear focus on the currently focused frame if any.
if (!m_page.get())
@@ -1002,11 +1236,11 @@ void WebViewImpl::setFocus(bool enable)
}
}
-bool WebViewImpl::handleCompositionEvent(WebCompositionCommand command,
- int cursorPosition,
- int targetStart,
- int targetEnd,
- const WebString& imeString)
+bool WebViewImpl::setComposition(
+ const WebString& text,
+ const WebVector<WebCompositionUnderline>& underlines,
+ int selectionStart,
+ int selectionEnd)
{
Frame* focused = focusedWebCoreFrame();
if (!focused || !m_imeAcceptEvents)
@@ -1014,13 +1248,12 @@ bool WebViewImpl::handleCompositionEvent(WebCompositionCommand command,
Editor* editor = focused->editor();
if (!editor)
return false;
- if (!editor->canEdit()) {
- // The input focus has been moved to another WebWidget object.
- // We should use this |editor| object only to complete the ongoing
- // composition.
- if (!editor->hasComposition())
- return false;
- }
+
+ // The input focus has been moved to another WebWidget object.
+ // We should use this |editor| object only to complete the ongoing
+ // composition.
+ if (!editor->canEdit() && !editor->hasComposition())
+ return false;
// We should verify the parent node of this IME composition node are
// editable because JavaScript may delete a parent node of the composition
@@ -1033,7 +1266,9 @@ bool WebViewImpl::handleCompositionEvent(WebCompositionCommand command,
return false;
}
- if (command == WebCompositionCommandDiscard) {
+ // If we're not going to fire a keypress event, then the keydown event was
+ // canceled. In that case, cancel any existing composition.
+ if (text.isEmpty() || m_suppressNextKeypressEvent) {
// A browser process sent an IPC message which does not contain a valid
// string, which means an ongoing composition has been canceled.
// If the ongoing composition has been canceled, replace the ongoing
@@ -1041,81 +1276,102 @@ bool WebViewImpl::handleCompositionEvent(WebCompositionCommand command,
String emptyString;
Vector<CompositionUnderline> emptyUnderlines;
editor->setComposition(emptyString, emptyUnderlines, 0, 0);
- } else {
- // A browser process sent an IPC message which contains a string to be
- // displayed in this Editor object.
- // To display the given string, set the given string to the
- // m_compositionNode member of this Editor object and display it.
- if (targetStart < 0)
- targetStart = 0;
- if (targetEnd < 0)
- targetEnd = static_cast<int>(imeString.length());
- String compositionString(imeString);
- // Create custom underlines.
- // To emphasize the selection, the selected region uses a solid black
- // for its underline while other regions uses a pale gray for theirs.
- Vector<CompositionUnderline> underlines(3);
- underlines[0].startOffset = 0;
- underlines[0].endOffset = targetStart;
- underlines[0].thick = true;
- underlines[0].color.setRGB(0xd3, 0xd3, 0xd3);
- underlines[1].startOffset = targetStart;
- underlines[1].endOffset = targetEnd;
- underlines[1].thick = true;
- underlines[1].color.setRGB(0x00, 0x00, 0x00);
- underlines[2].startOffset = targetEnd;
- underlines[2].endOffset = static_cast<int>(imeString.length());
- underlines[2].thick = true;
- underlines[2].color.setRGB(0xd3, 0xd3, 0xd3);
- // When we use custom underlines, WebKit ("InlineTextBox.cpp" Line 282)
- // prevents from writing a text in between 'selectionStart' and
- // 'selectionEnd' somehow.
- // Therefore, we use the 'cursorPosition' for these arguments so that
- // there are not any characters in the above region.
- editor->setComposition(compositionString, underlines,
- cursorPosition, cursorPosition);
- // The given string is a result string, which means the ongoing
- // composition has been completed. I have to call the
- // Editor::confirmCompletion() and complete this composition.
- if (command == WebCompositionCommandConfirm)
- editor->confirmComposition();
+ return text.isEmpty();
}
+ // When the range of composition underlines overlap with the range between
+ // selectionStart and selectionEnd, WebKit somehow won't paint the selection
+ // at all (see InlineTextBox::paint() function in InlineTextBox.cpp).
+ // But the selection range actually takes effect.
+ editor->setComposition(String(text),
+ CompositionUnderlineVectorBuilder(underlines),
+ selectionStart, selectionEnd);
+
return editor->hasComposition();
}
-bool WebViewImpl::queryCompositionStatus(bool* enableIME, WebRect* caretRect)
+bool WebViewImpl::confirmComposition()
+{
+ Frame* focused = focusedWebCoreFrame();
+ if (!focused || !m_imeAcceptEvents)
+ return false;
+ Editor* editor = focused->editor();
+ if (!editor || !editor->hasComposition())
+ return false;
+
+ // We should verify the parent node of this IME composition node are
+ // editable because JavaScript may delete a parent node of the composition
+ // node. In this case, WebKit crashes while deleting texts from the parent
+ // node, which doesn't exist any longer.
+ PassRefPtr<Range> range = editor->compositionRange();
+ if (range) {
+ const Node* node = range->startPosition().node();
+ if (!node || !node->isContentEditable())
+ return false;
+ }
+
+ editor->confirmComposition();
+ return true;
+}
+
+WebTextInputType WebViewImpl::textInputType()
{
- // Store whether the selected node needs IME and the caret rectangle.
- // This process consists of the following four steps:
- // 1. Retrieve the selection controller of the focused frame;
- // 2. Retrieve the caret rectangle from the controller;
- // 3. Convert the rectangle, which is relative to the parent view, to the
- // one relative to the client window, and;
- // 4. Store the converted rectangle.
+ WebTextInputType type = WebTextInputTypeNone;
const Frame* focused = focusedWebCoreFrame();
if (!focused)
- return false;
+ return type;
const Editor* editor = focused->editor();
if (!editor || !editor->canEdit())
- return false;
+ return type;
SelectionController* controller = focused->selection();
if (!controller)
- return false;
+ return type;
const Node* node = controller->start().node();
if (!node)
- return false;
+ return type;
+
+ // FIXME: Support more text input types when necessary, eg. Number,
+ // Date, Email, URL, etc.
+ if (controller->isInPasswordField())
+ type = WebTextInputTypePassword;
+ else if (node->shouldUseInputMethod())
+ type = WebTextInputTypeText;
- *enableIME = node->shouldUseInputMethod() && !controller->isInPasswordField();
- const FrameView* view = node->document()->view();
+ return type;
+}
+
+WebRect WebViewImpl::caretOrSelectionBounds()
+{
+ WebRect rect;
+ const Frame* focused = focusedWebCoreFrame();
+ if (!focused)
+ return rect;
+
+ SelectionController* controller = focused->selection();
+ if (!controller)
+ return rect;
+
+ const FrameView* view = focused->view();
if (!view)
- return false;
+ return rect;
- *caretRect = view->contentsToWindow(controller->absoluteCaretBounds());
- return true;
+ const Node* node = controller->start().node();
+ if (!node || !node->renderer())
+ return rect;
+
+ if (controller->isCaret())
+ rect = view->contentsToWindow(controller->absoluteCaretBounds());
+ else if (controller->isRange()) {
+ node = controller->end().node();
+ if (!node || !node->renderer())
+ return rect;
+ RefPtr<Range> range = controller->toNormalizedRange();
+ rect = view->contentsToWindow(focused->editor()->firstRectForRange(range.get()));
+ }
+ return rect;
}
void WebViewImpl::setTextDirection(WebTextDirection direction)
@@ -1151,6 +1407,15 @@ void WebViewImpl::setTextDirection(WebTextDirection direction)
}
}
+bool WebViewImpl::isAcceleratedCompositingActive() const
+{
+#if USE(ACCELERATED_COMPOSITING)
+ return m_isAcceleratedCompositingActive;
+#else
+ return false;
+#endif
+}
+
// WebView --------------------------------------------------------------------
WebSettings* WebViewImpl::settings()
@@ -1166,7 +1431,7 @@ WebString WebViewImpl::pageEncoding() const
if (!m_page.get())
return WebString();
- return m_page->mainFrame()->loader()->encoding();
+ return m_page->mainFrame()->loader()->writer()->encoding();
}
void WebViewImpl::setPageEncoding(const WebString& encodingName)
@@ -1191,7 +1456,7 @@ bool WebViewImpl::dispatchBeforeUnloadEvent()
if (!frame)
return true;
- return frame->shouldClose();
+ return frame->loader()->shouldClose();
}
void WebViewImpl::dispatchUnloadEvent()
@@ -1249,6 +1514,10 @@ void WebViewImpl::setInitialFocus(bool reverse)
keyboardEvent.windowsKeyCode = 0x09;
PlatformKeyboardEventBuilder platformEvent(keyboardEvent);
RefPtr<KeyboardEvent> webkitEvent = KeyboardEvent::create(platformEvent, 0);
+
+ Frame* frame = page()->focusController()->focusedOrMainFrame();
+ if (Document* document = frame->document())
+ document->setFocusedNode(0);
page()->focusController()->setInitialFocus(
reverse ? FocusDirectionBackward : FocusDirectionForward,
webkitEvent.get());
@@ -1288,25 +1557,71 @@ void WebViewImpl::clearFocusedNode()
}
}
-int WebViewImpl::zoomLevel()
+void WebViewImpl::scrollFocusedNodeIntoView()
+{
+ Node* focusedNode = focusedWebCoreNode();
+ if (focusedNode && focusedNode->isElementNode()) {
+ Element* elementNode = static_cast<Element*>(focusedNode);
+ elementNode->scrollIntoViewIfNeeded(true);
+ }
+}
+
+double WebViewImpl::zoomLevel()
{
return m_zoomLevel;
}
-int WebViewImpl::setZoomLevel(bool textOnly, int zoomLevel)
+double WebViewImpl::setZoomLevel(bool textOnly, double zoomLevel)
{
- float zoomFactor = static_cast<float>(
- std::max(std::min(std::pow(textSizeMultiplierRatio, zoomLevel),
- maxTextSizeMultiplier),
- minTextSizeMultiplier));
- Frame* frame = mainFrameImpl()->frame();
- if (zoomFactor != frame->zoomFactor()) {
+ if (zoomLevel < m_minimumZoomLevel)
+ m_zoomLevel = m_minimumZoomLevel;
+ else if (zoomLevel > m_maximumZoomLevel)
+ m_zoomLevel = m_maximumZoomLevel;
+ else
m_zoomLevel = zoomLevel;
- frame->setZoomFactor(zoomFactor, textOnly);
+
+ Frame* frame = mainFrameImpl()->frame();
+ WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(frame);
+ if (pluginContainer)
+ pluginContainer->plugin()->setZoomLevel(m_zoomLevel, textOnly);
+ else {
+ double zoomFactor = zoomLevelToZoomFactor(m_zoomLevel);
+ if (textOnly)
+ frame->setPageAndTextZoomFactors(1, zoomFactor);
+ else
+ frame->setPageAndTextZoomFactors(zoomFactor, 1);
}
return m_zoomLevel;
}
+void WebViewImpl::zoomLimitsChanged(double minimumZoomLevel,
+ double maximumZoomLevel)
+{
+ m_minimumZoomLevel = minimumZoomLevel;
+ m_maximumZoomLevel = maximumZoomLevel;
+ m_client->zoomLimitsChanged(m_minimumZoomLevel, m_maximumZoomLevel);
+}
+
+void WebViewImpl::fullFramePluginZoomLevelChanged(double zoomLevel)
+{
+ if (zoomLevel == m_zoomLevel)
+ return;
+
+ m_zoomLevel = std::max(std::min(zoomLevel, m_maximumZoomLevel), m_minimumZoomLevel);
+ m_client->zoomLevelChanged();
+}
+
+double WebView::zoomLevelToZoomFactor(double zoomLevel)
+{
+ return std::pow(textSizeMultiplierRatio, zoomLevel);
+}
+
+double WebView::zoomFactorToZoomLevel(double factor)
+{
+ // Since factor = 1.2^level, level = log(factor) / log(1.2)
+ return log(factor) / log(textSizeMultiplierRatio);
+}
+
void WebViewImpl::performMediaPlayerAction(const WebMediaPlayerAction& action,
const WebPoint& location)
{
@@ -1331,6 +1646,9 @@ void WebViewImpl::performMediaPlayerAction(const WebMediaPlayerAction& action,
case WebMediaPlayerAction::Loop:
mediaElement->setLoop(action.enable);
break;
+ case WebMediaPlayerAction::Controls:
+ mediaElement->setControls(action.enable);
+ break;
default:
ASSERT_NOT_REACHED();
}
@@ -1368,6 +1686,15 @@ void WebViewImpl::dragSourceEndedAt(
false, 0);
m_page->mainFrame()->eventHandler()->dragSourceEndedAt(pme,
static_cast<DragOperation>(operation));
+ m_dragScrollTimer->stop();
+}
+
+void WebViewImpl::dragSourceMovedTo(
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ WebDragOperation operation)
+{
+ m_dragScrollTimer->triggerScroll(mainFrameImpl()->frameView(), clientPoint);
}
void WebViewImpl::dragSourceSystemDragEnded()
@@ -1392,26 +1719,22 @@ WebDragOperation WebViewImpl::dragTargetDragEnter(
m_dragIdentity = identity;
m_operationsAllowed = operationsAllowed;
- DragData dragData(
- m_currentDragData.get(),
- clientPoint,
- screenPoint,
- static_cast<DragOperation>(operationsAllowed));
+ return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragEnter);
+}
- m_dropEffect = DropEffectDefault;
- m_dragTargetDispatch = true;
- DragOperation effect = m_page->dragController()->dragEntered(&dragData);
- // Mask the operation against the drag source's allowed operations.
- if ((effect & dragData.draggingSourceOperationMask()) != effect)
- effect = DragOperationNone;
- m_dragTargetDispatch = false;
+WebDragOperation WebViewImpl::dragTargetDragEnterNew(
+ int identity,
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ WebDragOperationsMask operationsAllowed)
+{
+ ASSERT(!m_currentDragData.get());
- if (m_dropEffect != DropEffectDefault) {
- m_dragOperation = (m_dropEffect != DropEffectNone) ? WebDragOperationCopy
- : WebDragOperationNone;
- } else
- m_dragOperation = static_cast<WebDragOperation>(effect);
- return m_dragOperation;
+ m_currentDragData = ChromiumDataObject::createReadable(Clipboard::DragAndDrop);
+ m_dragIdentity = identity;
+ m_operationsAllowed = operationsAllowed;
+
+ return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragEnter);
}
WebDragOperation WebViewImpl::dragTargetDragOver(
@@ -1419,29 +1742,9 @@ WebDragOperation WebViewImpl::dragTargetDragOver(
const WebPoint& screenPoint,
WebDragOperationsMask operationsAllowed)
{
- ASSERT(m_currentDragData.get());
-
m_operationsAllowed = operationsAllowed;
- DragData dragData(
- m_currentDragData.get(),
- clientPoint,
- screenPoint,
- static_cast<DragOperation>(operationsAllowed));
-
- m_dropEffect = DropEffectDefault;
- m_dragTargetDispatch = true;
- DragOperation effect = m_page->dragController()->dragUpdated(&dragData);
- // Mask the operation against the drag source's allowed operations.
- if ((effect & dragData.draggingSourceOperationMask()) != effect)
- effect = DragOperationNone;
- m_dragTargetDispatch = false;
- if (m_dropEffect != DropEffectDefault) {
- m_dragOperation = (m_dropEffect != DropEffectNone) ? WebDragOperationCopy
- : WebDragOperationNone;
- } else
- m_dragOperation = static_cast<WebDragOperation>(effect);
- return m_dragOperation;
+ return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragOver);
}
void WebViewImpl::dragTargetDragLeave()
@@ -1495,6 +1798,7 @@ void WebViewImpl::dragTargetDrop(const WebPoint& clientPoint,
m_dropEffect = DropEffectDefault;
m_dragOperation = WebDragOperationNone;
m_dragIdentity = 0;
+ m_dragScrollTimer->stop();
}
int WebViewImpl::dragIdentity()
@@ -1504,7 +1808,42 @@ int WebViewImpl::dragIdentity()
return 0;
}
-unsigned long WebViewImpl::createUniqueIdentifierForRequest() {
+WebDragOperation WebViewImpl::dragTargetDragEnterOrOver(const WebPoint& clientPoint, const WebPoint& screenPoint, DragAction dragAction)
+{
+ ASSERT(m_currentDragData.get());
+
+ DragData dragData(
+ m_currentDragData.get(),
+ clientPoint,
+ screenPoint,
+ static_cast<DragOperation>(m_operationsAllowed));
+
+ m_dropEffect = DropEffectDefault;
+ m_dragTargetDispatch = true;
+ DragOperation effect = dragAction == DragEnter ? m_page->dragController()->dragEntered(&dragData)
+ : m_page->dragController()->dragUpdated(&dragData);
+ // Mask the operation against the drag source's allowed operations.
+ if (!(effect & dragData.draggingSourceOperationMask()))
+ effect = DragOperationNone;
+ m_dragTargetDispatch = false;
+
+ if (m_dropEffect != DropEffectDefault) {
+ m_dragOperation = (m_dropEffect != DropEffectNone) ? WebDragOperationCopy
+ : WebDragOperationNone;
+ } else
+ m_dragOperation = static_cast<WebDragOperation>(effect);
+
+ if (dragAction == DragOver)
+ m_dragScrollTimer->triggerScroll(mainFrameImpl()->frameView(), clientPoint);
+ else
+ m_dragScrollTimer->stop();
+
+
+ return m_dragOperation;
+}
+
+unsigned long WebViewImpl::createUniqueIdentifierForRequest()
+{
if (m_page)
return m_page->progress()->createUniqueIdentifier();
return 0;
@@ -1537,15 +1876,24 @@ void WebViewImpl::setInspectorSettings(const WebString& settings)
m_inspectorSettings = settings;
}
-WebDevToolsAgent* WebViewImpl::devToolsAgent()
+bool WebViewImpl::inspectorSetting(const WebString& key, WebString* value) const
{
- return m_devToolsAgent.get();
+ if (!m_inspectorSettingsMap->contains(key))
+ return false;
+ *value = m_inspectorSettingsMap->get(key);
+ return true;
}
-void WebViewImpl::setDevToolsAgent(WebDevToolsAgent* devToolsAgent)
+void WebViewImpl::setInspectorSetting(const WebString& key,
+ const WebString& value)
{
- ASSERT(!m_devToolsAgent.get()); // May only set once!
- m_devToolsAgent.set(static_cast<WebDevToolsAgentPrivate*>(devToolsAgent));
+ m_inspectorSettingsMap->set(key, value);
+ client()->didUpdateInspectorSetting(key, value);
+}
+
+WebDevToolsAgent* WebViewImpl::devToolsAgent()
+{
+ return m_devToolsAgent.get();
}
WebAccessibilityObject WebViewImpl::accessibilityObject()
@@ -1558,25 +1906,31 @@ WebAccessibilityObject WebViewImpl::accessibilityObject()
document->axObjectCache()->getOrCreate(document->renderer()));
}
-void WebViewImpl::applyAutofillSuggestions(
+void WebViewImpl::applyAutoFillSuggestions(
const WebNode& node,
- const WebVector<WebString>& suggestions,
- int defaultSuggestionIndex)
+ const WebVector<WebString>& names,
+ const WebVector<WebString>& labels,
+ const WebVector<int>& uniqueIDs,
+ int separatorIndex)
{
- applyAutocompleteSuggestions(node, suggestions, defaultSuggestionIndex);
+ WebVector<WebString> icons(names.size());
+ applyAutoFillSuggestions(node, names, labels, icons, uniqueIDs, separatorIndex);
}
void WebViewImpl::applyAutoFillSuggestions(
const WebNode& node,
const WebVector<WebString>& names,
const WebVector<WebString>& labels,
- int defaultSuggestionIndex)
+ const WebVector<WebString>& icons,
+ const WebVector<int>& uniqueIDs,
+ int separatorIndex)
{
ASSERT(names.size() == labels.size());
- ASSERT(defaultSuggestionIndex < static_cast<int>(names.size()));
+ ASSERT(names.size() == uniqueIDs.size());
+ ASSERT(separatorIndex < static_cast<int>(names.size()));
if (names.isEmpty()) {
- hideSuggestionsPopup();
+ hideAutoFillPopup();
return;
}
@@ -1585,7 +1939,7 @@ void WebViewImpl::applyAutoFillSuggestions(
// focused node, then we have nothing to do. FIXME: also check the
// caret is at the end and that the text has not changed.
if (!focusedNode || focusedNode != PassRefPtr<Node>(node)) {
- hideSuggestionsPopup();
+ hideAutoFillPopup();
return;
}
@@ -1597,98 +1951,51 @@ void WebViewImpl::applyAutoFillSuggestions(
if (!m_autoFillPopupClient.get())
m_autoFillPopupClient.set(new AutoFillPopupMenuClient);
- m_autoFillPopupClient->initialize(inputElem, names, labels,
- defaultSuggestionIndex);
-
- if (m_suggestionsPopupClient != m_autoFillPopupClient.get()) {
- hideSuggestionsPopup();
- m_suggestionsPopupClient = m_autoFillPopupClient.get();
- }
+ m_autoFillPopupClient->initialize(
+ inputElem, names, labels, icons, uniqueIDs, separatorIndex);
if (!m_autoFillPopup.get()) {
- m_autoFillPopup = PopupContainer::create(m_suggestionsPopupClient,
- suggestionsPopupSettings);
+ m_autoFillPopup = PopupContainer::create(m_autoFillPopupClient.get(),
+ PopupContainer::Suggestion,
+ autoFillPopupSettings);
}
- if (m_suggestionsPopup != m_autoFillPopup.get())
- m_suggestionsPopup = m_autoFillPopup.get();
-
- if (m_suggestionsPopupShowing) {
- m_autoFillPopupClient->setSuggestions(names, labels);
- refreshSuggestionsPopup();
+ if (m_autoFillPopupShowing) {
+ refreshAutoFillPopup();
} else {
- m_suggestionsPopup->show(focusedNode->getRect(),
- focusedNode->ownerDocument()->view(), 0);
- m_suggestionsPopupShowing = true;
+ m_autoFillPopup->show(focusedNode->getRect(), focusedNode->ownerDocument()->view(), 0);
+ m_autoFillPopupShowing = true;
}
+
+ // DEPRECATED: This special mode will go away once AutoFill and Autocomplete
+ // merge is complete.
+ if (m_autoFillPopupClient)
+ m_autoFillPopupClient->setAutocompleteMode(false);
}
+// DEPRECATED: replacing with applyAutoFillSuggestions.
void WebViewImpl::applyAutocompleteSuggestions(
const WebNode& node,
const WebVector<WebString>& suggestions,
int defaultSuggestionIndex)
{
- ASSERT(defaultSuggestionIndex < static_cast<int>(suggestions.size()));
+ WebVector<WebString> names(suggestions.size());
+ WebVector<WebString> labels(suggestions.size());
+ WebVector<WebString> icons(suggestions.size());
+ WebVector<int> uniqueIDs(suggestions.size());
- if (!m_page.get() || suggestions.isEmpty()) {
- hideSuggestionsPopup();
- return;
- }
+ for (size_t i = 0; i < suggestions.size(); ++i)
+ names[i] = suggestions[i];
- RefPtr<Node> focusedNode = focusedWebCoreNode();
- // If the node for which we queried the Autocomplete suggestions is not the
- // focused node, then we have nothing to do. FIXME: also check the
- // caret is at the end and that the text has not changed.
- if (!focusedNode || focusedNode != PassRefPtr<Node>(node)) {
- hideSuggestionsPopup();
- return;
- }
-
- HTMLInputElement* inputElem =
- static_cast<HTMLInputElement*>(focusedNode.get());
-
- // The first time the Autocomplete is shown we'll create the client and the
- // popup.
- if (!m_autocompletePopupClient.get())
- m_autocompletePopupClient.set(new AutocompletePopupMenuClient);
-
- m_autocompletePopupClient->initialize(inputElem, suggestions,
- defaultSuggestionIndex);
-
- if (m_suggestionsPopupClient != m_autocompletePopupClient.get()) {
- hideSuggestionsPopup();
- m_suggestionsPopupClient = m_autocompletePopupClient.get();
- }
-
- if (!m_autocompletePopup.get()) {
- m_autocompletePopup = PopupContainer::create(m_suggestionsPopupClient,
- suggestionsPopupSettings);
- }
-
- if (m_suggestionsPopup != m_autocompletePopup.get())
- m_suggestionsPopup = m_autocompletePopup.get();
-
- if (m_suggestionsPopupShowing) {
- m_autocompletePopupClient->setSuggestions(suggestions);
- refreshSuggestionsPopup();
- } else {
- m_suggestionsPopup->show(focusedNode->getRect(),
- focusedNode->ownerDocument()->view(), 0);
- m_suggestionsPopupShowing = true;
- }
+ applyAutoFillSuggestions(node, names, labels, icons, uniqueIDs, -1);
+ if (m_autoFillPopupClient)
+ m_autoFillPopupClient->setAutocompleteMode(true);
}
-void WebViewImpl::hideAutofillPopup()
+void WebViewImpl::hidePopups()
{
- hideSuggestionsPopup();
-}
-
-void WebViewImpl::hideSuggestionsPopup()
-{
- if (m_suggestionsPopupShowing) {
- m_suggestionsPopup->hidePopup();
- m_suggestionsPopupShowing = false;
- }
+ hideSelectPopup();
+ hideAutoFillPopup();
}
void WebViewImpl::performCustomContextMenuAction(unsigned action)
@@ -1744,11 +2051,16 @@ bool WebViewImpl::isActive() const
return (page() && page()->focusController()) ? page()->focusController()->isActive() : false;
}
+void WebViewImpl::setDomainRelaxationForbidden(bool forbidden, const WebString& scheme)
+{
+ SecurityOrigin::setDomainRelaxationForbiddenForURLScheme(forbidden, String(scheme));
+}
+
void WebViewImpl::setScrollbarColors(unsigned inactiveColor,
unsigned activeColor,
unsigned trackColor) {
-#if OS(LINUX)
- RenderThemeChromiumLinux::setScrollbarColors(inactiveColor,
+#if OS(LINUX) || OS(FREEBSD)
+ PlatformThemeChromiumGtk::setScrollbarColors(inactiveColor,
activeColor,
trackColor);
#endif
@@ -1758,7 +2070,7 @@ void WebViewImpl::setSelectionColors(unsigned activeBackgroundColor,
unsigned activeForegroundColor,
unsigned inactiveBackgroundColor,
unsigned inactiveForegroundColor) {
-#if OS(LINUX)
+#if OS(LINUX) || OS(FREEBSD)
RenderThemeChromiumLinux::setSelectionColors(activeBackgroundColor,
activeForegroundColor,
inactiveBackgroundColor,
@@ -1767,15 +2079,45 @@ void WebViewImpl::setSelectionColors(unsigned activeBackgroundColor,
#endif
}
-void WebViewImpl::addUserScript(const WebString& sourceCode, bool runAtStart)
+void WebView::addUserScript(const WebString& sourceCode,
+ const WebVector<WebString>& patternsIn,
+ WebView::UserScriptInjectAt injectAt,
+ WebView::UserContentInjectIn injectIn)
+{
+ OwnPtr<Vector<String> > patterns(new Vector<String>);
+ for (size_t i = 0; i < patternsIn.size(); ++i)
+ patterns->append(patternsIn[i]);
+
+ PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName);
+ RefPtr<DOMWrapperWorld> world(DOMWrapperWorld::create());
+ pageGroup->addUserScriptToWorld(world.get(), sourceCode, WebURL(), patterns.release(), 0,
+ static_cast<UserScriptInjectionTime>(injectAt),
+ static_cast<UserContentInjectedFrames>(injectIn));
+}
+
+void WebView::addUserStyleSheet(const WebString& sourceCode,
+ const WebVector<WebString>& patternsIn,
+ WebView::UserContentInjectIn injectIn,
+ WebView::UserStyleInjectionTime injectionTime)
{
+ OwnPtr<Vector<String> > patterns(new Vector<String>);
+ for (size_t i = 0; i < patternsIn.size(); ++i)
+ patterns->append(patternsIn[i]);
+
PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName);
RefPtr<DOMWrapperWorld> world(DOMWrapperWorld::create());
- pageGroup->addUserScriptToWorld(world.get(), sourceCode, WebURL(), 0, 0,
- runAtStart ? InjectAtDocumentStart : InjectAtDocumentEnd);
+
+ // FIXME: Current callers always want the level to be "author". It probably makes sense to let
+ // callers specify this though, since in other cases the caller will probably want "user" level.
+ //
+ // FIXME: It would be nice to populate the URL correctly, instead of passing an empty URL.
+ pageGroup->addUserStyleSheetToWorld(world.get(), sourceCode, WebURL(), patterns.release(), 0,
+ static_cast<UserContentInjectedFrames>(injectIn),
+ UserStyleAuthorLevel,
+ static_cast<WebCore::UserStyleInjectionTime>(injectionTime));
}
-void WebViewImpl::removeAllUserContent()
+void WebView::removeAllUserContent()
{
PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName);
pageGroup->removeAllUserContent();
@@ -1794,12 +2136,17 @@ void WebViewImpl::didCommitLoad(bool* isNewNavigation)
m_observedNewNavigation = false;
}
+bool WebViewImpl::useExternalPopupMenus()
+{
+ return shouldUseExternalPopupMenus;
+}
+
bool WebViewImpl::navigationPolicyFromMouseEvent(unsigned short button,
bool ctrl, bool shift,
bool alt, bool meta,
WebNavigationPolicy* policy)
{
-#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD)
+#if OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) || OS(SOLARIS)
const bool newTabModifier = (button == 1) || ctrl;
#elif OS(DARWIN)
const bool newTabModifier = (button == 1) || meta;
@@ -1822,15 +2169,16 @@ bool WebViewImpl::navigationPolicyFromMouseEvent(unsigned short button,
return true;
}
-void WebViewImpl::startDragging(const WebPoint& eventPos,
- const WebDragData& dragData,
- WebDragOperationsMask mask)
+void WebViewImpl::startDragging(const WebDragData& dragData,
+ WebDragOperationsMask mask,
+ const WebImage& dragImage,
+ const WebPoint& dragImageOffset)
{
if (!m_client)
return;
ASSERT(!m_doingDragAndDrop);
m_doingDragAndDrop = true;
- m_client->startDragging(eventPos, dragData, mask);
+ m_client->startDragging(dragData, mask, dragImage, dragImageOffset);
}
void WebViewImpl::setCurrentHistoryItem(HistoryItem* item)
@@ -1866,24 +2214,25 @@ NotificationPresenterImpl* WebViewImpl::notificationPresenterImpl()
}
#endif
-void WebViewImpl::refreshSuggestionsPopup()
+void WebViewImpl::refreshAutoFillPopup()
{
- ASSERT(m_suggestionsPopupShowing);
+ ASSERT(m_autoFillPopupShowing);
// Hide the popup if it has become empty.
- if (!m_autocompletePopupClient->listSize()) {
- hideSuggestionsPopup();
+ if (!m_autoFillPopupClient->listSize()) {
+ hideAutoFillPopup();
return;
}
- IntRect oldBounds = m_suggestionsPopup->boundsRect();
- m_suggestionsPopup->refresh();
- IntRect newBounds = m_suggestionsPopup->boundsRect();
+ IntRect oldBounds = m_autoFillPopup->boundsRect();
+ m_autoFillPopup->refresh();
+ IntRect newBounds = m_autoFillPopup->boundsRect();
// Let's resize the backing window if necessary.
if (oldBounds != newBounds) {
WebPopupMenuImpl* popupMenu =
- static_cast<WebPopupMenuImpl*>(m_suggestionsPopup->client());
- popupMenu->client()->setWindowRect(newBounds);
+ static_cast<WebPopupMenuImpl*>(m_autoFillPopup->client());
+ if (popupMenu)
+ popupMenu->client()->setWindowRect(newBounds);
}
}
@@ -1916,4 +2265,285 @@ bool WebViewImpl::tabsToLinks() const
return m_tabsToLinks;
}
+#if USE(ACCELERATED_COMPOSITING)
+bool WebViewImpl::allowsAcceleratedCompositing()
+{
+ return !m_compositorCreationFailed;
+}
+
+void WebViewImpl::setRootGraphicsLayer(WebCore::PlatformLayer* layer)
+{
+ setIsAcceleratedCompositingActive(layer ? true : false);
+ if (m_layerRenderer)
+ m_layerRenderer->setRootLayer(layer);
+
+ IntRect damagedRect(0, 0, m_size.width, m_size.height);
+ if (m_isAcceleratedCompositingActive)
+ invalidateRootLayerRect(damagedRect);
+ else
+ m_client->didInvalidateRect(damagedRect);
+}
+
+void WebViewImpl::setRootLayerNeedsDisplay()
+{
+ m_client->scheduleComposite();
+}
+
+
+void WebViewImpl::scrollRootLayerRect(const IntSize& scrollDelta, const IntRect& clipRect)
+{
+ ASSERT(m_layerRenderer);
+ // Compute the damage rect in viewport space.
+ WebFrameImpl* webframe = mainFrameImpl();
+ if (!webframe)
+ return;
+ FrameView* view = webframe->frameView();
+ if (!view)
+ return;
+
+ IntRect contentRect = view->visibleContentRect(false);
+ IntRect screenRect = view->contentsToWindow(contentRect);
+
+ // We support fast scrolling in one direction at a time.
+ if (scrollDelta.width() && scrollDelta.height()) {
+ invalidateRootLayerRect(WebRect(screenRect));
+ return;
+ }
+
+ // Compute the region we will expose by scrolling. We use the
+ // content rect for invalidation. Using this space for damage
+ // rects allows us to intermix invalidates with scrolls.
+ IntRect damagedContentsRect;
+ if (scrollDelta.width()) {
+ int dx = scrollDelta.width();
+ damagedContentsRect.setY(screenRect.y());
+ damagedContentsRect.setHeight(screenRect.height());
+ if (dx > 0) {
+ damagedContentsRect.setX(screenRect.x());
+ damagedContentsRect.setWidth(dx);
+ } else {
+ damagedContentsRect.setX(screenRect.right() + dx);
+ damagedContentsRect.setWidth(-dx);
+ }
+ } else {
+ int dy = scrollDelta.height();
+ damagedContentsRect.setX(screenRect.x());
+ damagedContentsRect.setWidth(screenRect.width());
+ if (dy > 0) {
+ damagedContentsRect.setY(screenRect.y());
+ damagedContentsRect.setHeight(dy);
+ } else {
+ damagedContentsRect.setY(screenRect.bottom() + dy);
+ damagedContentsRect.setHeight(-dy);
+ }
+ }
+
+ // Move the previous damage
+ m_rootLayerScrollDamage.move(scrollDelta.width(), scrollDelta.height());
+ // Union with the new damage rect.
+ m_rootLayerScrollDamage.unite(damagedContentsRect);
+
+ // Scroll any existing damage that intersects with clip rect
+ if (clipRect.intersects(m_rootLayerDirtyRect)) {
+ // Find the inner damage
+ IntRect innerDamage(clipRect);
+ innerDamage.intersect(m_rootLayerDirtyRect);
+
+ // Move the damage
+ innerDamage.move(scrollDelta.width(), scrollDelta.height());
+
+ // Merge it back into the damaged rect
+ m_rootLayerDirtyRect.unite(innerDamage);
+ }
+
+ setRootLayerNeedsDisplay();
+}
+
+void WebViewImpl::invalidateRootLayerRect(const IntRect& rect)
+{
+ ASSERT(m_layerRenderer);
+
+ if (!page())
+ return;
+
+ // FIXME: add a smarter damage aggregation logic and/or unify with
+ // LayerChromium's damage logic
+ m_rootLayerDirtyRect.unite(rect);
+ setRootLayerNeedsDisplay();
+}
+
+
+void WebViewImpl::setIsAcceleratedCompositingActive(bool active)
+{
+ ChromiumBridge::histogramEnumeration("GPU.setIsAcceleratedCompositingActive", active * 2 + m_isAcceleratedCompositingActive, 4);
+
+ if (m_isAcceleratedCompositingActive == active)
+ return;
+
+ if (!active) {
+ m_isAcceleratedCompositingActive = false;
+ if (m_layerRenderer)
+ m_layerRenderer->finish(); // finish all GL rendering before we hide the window?
+ m_client->didActivateAcceleratedCompositing(false);
+ return;
+ }
+
+ if (m_layerRenderer) {
+ m_isAcceleratedCompositingActive = true;
+ m_layerRenderer->resizeOnscreenContent(WebCore::IntSize(std::max(1, m_size.width),
+ std::max(1, m_size.height)));
+
+ m_client->didActivateAcceleratedCompositing(true);
+ return;
+ }
+
+ RefPtr<GraphicsContext3D> context = m_temporaryOnscreenGraphicsContext3D.release();
+ if (!context) {
+ context = GraphicsContext3D::create(getCompositorContextAttributes(), m_page->chrome(), GraphicsContext3D::RenderDirectlyToHostWindow);
+ if (context)
+ context->reshape(std::max(1, m_size.width), std::max(1, m_size.height));
+ }
+ m_layerRenderer = LayerRendererChromium::create(context.release());
+ if (m_layerRenderer) {
+ m_client->didActivateAcceleratedCompositing(true);
+ m_isAcceleratedCompositingActive = true;
+ m_compositorCreationFailed = false;
+ } else {
+ m_isAcceleratedCompositingActive = false;
+ m_client->didActivateAcceleratedCompositing(false);
+ m_compositorCreationFailed = true;
+ }
+}
+
+void WebViewImpl::updateRootLayerContents(const IntRect& rect)
+{
+ if (!isAcceleratedCompositingActive())
+ return;
+
+ WebFrameImpl* webframe = mainFrameImpl();
+ if (!webframe)
+ return;
+ FrameView* view = webframe->frameView();
+ if (!view)
+ return;
+
+ LayerChromium* rootLayer = m_layerRenderer->rootLayer();
+ if (rootLayer) {
+ IntRect visibleRect = view->visibleContentRect(true);
+
+ m_layerRenderer->setRootLayerCanvasSize(IntSize(rect.width(), rect.height()));
+ GraphicsContext* rootLayerContext = m_layerRenderer->rootLayerGraphicsContext();
+
+#if PLATFORM(SKIA)
+ PlatformContextSkia* skiaContext = rootLayerContext->platformContext();
+ skia::PlatformCanvas* platformCanvas = skiaContext->canvas();
+
+ platformCanvas->save();
+
+ // Bring the canvas into the coordinate system of the paint rect.
+ platformCanvas->translate(static_cast<SkScalar>(-rect.x()), static_cast<SkScalar>(-rect.y()));
+
+ rootLayerContext->save();
+
+ webframe->paintWithContext(*rootLayerContext, rect);
+ rootLayerContext->restore();
+
+ platformCanvas->restore();
+#elif PLATFORM(CG)
+ CGContextRef cgContext = rootLayerContext->platformContext();
+
+ CGContextSaveGState(cgContext);
+
+ // Bring the CoreGraphics context into the coordinate system of the paint rect.
+ CGContextTranslateCTM(cgContext, -rect.x(), -rect.y());
+
+ rootLayerContext->save();
+
+ webframe->paintWithContext(*rootLayerContext, rect);
+ rootLayerContext->restore();
+
+ CGContextRestoreGState(cgContext);
+#else
+#error Must port to your platform
+#endif
+ }
+}
+
+void WebViewImpl::doComposite()
+{
+ ASSERT(isAcceleratedCompositingActive());
+ if (!page())
+ return;
+ FrameView* view = page()->mainFrame()->view();
+
+ // The visibleRect includes scrollbars whereas the contentRect doesn't.
+ IntRect visibleRect = view->visibleContentRect(true);
+ IntRect contentRect = view->visibleContentRect(false);
+ IntRect viewPort = IntRect(0, 0, m_size.width, m_size.height);
+
+ // Give the compositor a chance to setup/resize the root texture handle and perform scrolling.
+ m_layerRenderer->prepareToDrawLayers(visibleRect, contentRect, IntPoint(view->scrollX(), view->scrollY()));
+
+ // Draw the contents of the root layer.
+ Vector<IntRect> damageRects;
+ damageRects.append(m_rootLayerScrollDamage);
+ damageRects.append(m_rootLayerDirtyRect);
+ for (size_t i = 0; i < damageRects.size(); ++i) {
+ IntRect damagedRect = damageRects[i];
+
+ // Intersect this rectangle with the viewPort.
+ damagedRect.intersect(viewPort);
+
+ // Now render it.
+ if (damagedRect.width() && damagedRect.height()) {
+ updateRootLayerContents(damagedRect);
+ m_layerRenderer->updateRootLayerTextureRect(damagedRect);
+ }
+ }
+ m_rootLayerDirtyRect = IntRect();
+ m_rootLayerScrollDamage = IntRect();
+
+ // Draw the actual layers...
+ m_layerRenderer->drawLayers(visibleRect, contentRect);
+}
+
+void WebViewImpl::reallocateRenderer()
+{
+ GraphicsContext3D* context = m_layerRenderer->context();
+ RefPtr<GraphicsContext3D> newContext = GraphicsContext3D::create(context->getContextAttributes(), m_page->chrome(), GraphicsContext3D::RenderDirectlyToHostWindow);
+ // GraphicsContext3D::create might fail and return 0, in that case LayerRendererChromium::create will also return 0.
+ RefPtr<LayerRendererChromium> layerRenderer = LayerRendererChromium::create(newContext);
+
+ // Reattach the root layer. Child layers will get reattached as a side effect of updateLayersRecursive.
+ if (layerRenderer)
+ m_layerRenderer->transferRootLayer(layerRenderer.get());
+ m_layerRenderer = layerRenderer;
+
+ // Enable or disable accelerated compositing and request a refresh.
+ setRootGraphicsLayer(m_layerRenderer ? m_layerRenderer->rootLayer() : 0);
+}
+#endif
+
+
+WebGraphicsContext3D* WebViewImpl::graphicsContext3D()
+{
+#if USE(ACCELERATED_COMPOSITING)
+ if (m_page->settings()->acceleratedCompositingEnabled() && allowsAcceleratedCompositing()) {
+ GraphicsContext3D* context = 0;
+ if (m_layerRenderer)
+ context = m_layerRenderer->context();
+ else if (m_temporaryOnscreenGraphicsContext3D)
+ context = m_temporaryOnscreenGraphicsContext3D.get();
+ else {
+ m_temporaryOnscreenGraphicsContext3D = GraphicsContext3D::create(getCompositorContextAttributes(), m_page->chrome(), GraphicsContext3D::RenderDirectlyToHostWindow);
+ if (m_temporaryOnscreenGraphicsContext3D)
+ m_temporaryOnscreenGraphicsContext3D->reshape(std::max(1, m_size.width), std::max(1, m_size.height));
+ context = m_temporaryOnscreenGraphicsContext3D.get();
+ }
+ return GraphicsContext3DInternal::extractWebGraphicsContext3D(context);
+ }
+#endif
+ return 0;
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebViewImpl.h b/WebKit/chromium/src/WebViewImpl.h
index 286ac43..0388770 100644
--- a/WebKit/chromium/src/WebViewImpl.h
+++ b/WebKit/chromium/src/WebViewImpl.h
@@ -31,21 +31,24 @@
#ifndef WebViewImpl_h
#define WebViewImpl_h
-// FIXME: Remove these relative paths once consumers from glue are removed.
-#include "../public/WebNavigationPolicy.h"
-#include "../public/WebPoint.h"
-#include "../public/WebSize.h"
-#include "../public/WebString.h"
-#include "../public/WebView.h"
+#include "WebNavigationPolicy.h"
+#include "WebPoint.h"
+#include "WebRect.h"
+#include "WebSize.h"
+#include "WebString.h"
+#include "WebView.h"
#include "BackForwardListClientImpl.h"
#include "ChromeClientImpl.h"
#include "ContextMenuClientImpl.h"
#include "DragClientImpl.h"
#include "EditorClientImpl.h"
+#include "GraphicsContext3D.h"
+#include "GraphicsLayer.h"
#include "InspectorClientImpl.h"
+#include "IntRect.h"
+#include "LayerRendererChromium.h"
#include "NotificationPresenterImpl.h"
-
#include <wtf/OwnPtr.h>
#include <wtf/RefCounted.h>
@@ -68,14 +71,19 @@ namespace WebKit {
class AutocompletePopupMenuClient;
class AutoFillPopupMenuClient;
class ContextMenuClientImpl;
-class SuggestionsPopupMenuClient;
+class DeviceOrientationClientProxy;
+class DragScrollTimer;
+class SpeechInputClientImpl;
class WebAccessibilityObject;
+class WebDevToolsAgentClient;
class WebDevToolsAgentPrivate;
class WebFrameImpl;
+class WebImage;
class WebKeyboardEvent;
class WebMouseEvent;
class WebMouseWheelEvent;
class WebSettingsImpl;
+class WebTouchEvent;
class WebViewImpl : public WebView, public RefCounted<WebViewImpl> {
public:
@@ -85,17 +93,21 @@ public:
virtual void resize(const WebSize&);
virtual void layout();
virtual void paint(WebCanvas*, const WebRect&);
+ virtual void themeChanged();
+ virtual void composite(bool finish);
virtual bool handleInputEvent(const WebInputEvent&);
virtual void mouseCaptureLost();
virtual void setFocus(bool enable);
- virtual bool handleCompositionEvent(WebCompositionCommand command,
- int cursorPosition,
- int targetStart,
- int targetEnd,
- const WebString& text);
- virtual bool queryCompositionStatus(bool* enabled,
- WebRect* caretRect);
+ virtual bool setComposition(
+ const WebString& text,
+ const WebVector<WebCompositionUnderline>& underlines,
+ int selectionStart,
+ int selectionEnd);
+ virtual bool confirmComposition();
+ virtual WebTextInputType textInputType();
+ virtual WebRect caretOrSelectionBounds();
virtual void setTextDirection(WebTextDirection direction);
+ virtual bool isAcceleratedCompositingActive() const;
// WebView methods:
virtual void initializeMainFrame(WebFrameClient*);
@@ -110,6 +122,7 @@ public:
virtual void setTabKeyCyclesThroughElements(bool value);
virtual bool isActive() const;
virtual void setIsActive(bool value);
+ virtual void setDomainRelaxationForbidden(bool, const WebString& scheme);
virtual bool dispatchBeforeUnloadEvent();
virtual void dispatchUnloadEvent();
virtual WebFrame* mainFrame();
@@ -119,8 +132,11 @@ public:
virtual void setFocusedFrame(WebFrame* frame);
virtual void setInitialFocus(bool reverse);
virtual void clearFocusedNode();
- virtual int zoomLevel();
- virtual int setZoomLevel(bool textOnly, int zoomLevel);
+ virtual void scrollFocusedNodeIntoView();
+ virtual double zoomLevel();
+ virtual double setZoomLevel(bool textOnly, double zoomLevel);
+ virtual void zoomLimitsChanged(double minimumZoomLevel,
+ double maximumZoomLevel);
virtual void performMediaPlayerAction(
const WebMediaPlayerAction& action,
const WebPoint& location);
@@ -129,12 +145,21 @@ public:
const WebPoint& clientPoint,
const WebPoint& screenPoint,
WebDragOperation operation);
+ virtual void dragSourceMovedTo(
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ WebDragOperation operation);
virtual void dragSourceSystemDragEnded();
virtual WebDragOperation dragTargetDragEnter(
const WebDragData& dragData, int identity,
const WebPoint& clientPoint,
const WebPoint& screenPoint,
WebDragOperationsMask operationsAllowed);
+ virtual WebDragOperation dragTargetDragEnterNew(
+ int identity,
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ WebDragOperationsMask operationsAllowed);
virtual WebDragOperation dragTargetDragOver(
const WebPoint& clientPoint,
const WebPoint& screenPoint,
@@ -149,24 +174,31 @@ public:
virtual void inspectElementAt(const WebPoint& point);
virtual WebString inspectorSettings() const;
virtual void setInspectorSettings(const WebString& settings);
+ virtual bool inspectorSetting(const WebString& key, WebString* value) const;
+ virtual void setInspectorSetting(const WebString& key,
+ const WebString& value);
virtual WebDevToolsAgent* devToolsAgent();
- virtual void setDevToolsAgent(WebDevToolsAgent*);
virtual WebAccessibilityObject accessibilityObject();
- virtual void applyAutofillSuggestions(
+ // DEPRECATED.
+ virtual void applyAutoFillSuggestions(
const WebNode&,
- const WebVector<WebString>& suggestions,
- int defaultSuggestionIndex);
+ const WebVector<WebString>& names,
+ const WebVector<WebString>& labels,
+ const WebVector<int>& uniqueIDs,
+ int separatorIndex);
virtual void applyAutoFillSuggestions(
const WebNode&,
const WebVector<WebString>& names,
const WebVector<WebString>& labels,
- int defaultSuggestionIndex);
+ const WebVector<WebString>& icons,
+ const WebVector<int>& uniqueIDs,
+ int separatorIndex);
+ // DEPRECATED: replacing with applyAutoFillSuggestions.
virtual void applyAutocompleteSuggestions(
const WebNode&,
const WebVector<WebString>& suggestions,
int defaultSuggestionIndex);
- virtual void hideAutofillPopup();
- virtual void hideSuggestionsPopup();
+ virtual void hidePopups();
virtual void setScrollbarColors(unsigned inactiveColor,
unsigned activeColor,
unsigned trackColor);
@@ -175,9 +207,6 @@ public:
unsigned inactiveBackgroundColor,
unsigned inactiveForegroundColor);
virtual void performCustomContextMenuAction(unsigned action);
- virtual void addUserScript(const WebString& sourceCode,
- bool runAtStart);
- virtual void removeAllUserContent();
// WebViewImpl
@@ -201,7 +230,7 @@ public:
return m_client;
}
- // Returns the page object associated with this view. This may be null when
+ // Returns the page object associated with this view. This may be null when
// the page is shutting down, but will be valid at all other times.
WebCore::Page* page() const
{
@@ -210,7 +239,7 @@ public:
WebCore::RenderTheme* theme() const;
- // Returns the main frame associated with this view. This may be null when
+ // Returns the main frame associated with this view. This may be null when
// the page is shutting down, but will be valid at all other times.
WebFrameImpl* mainFrameImpl();
@@ -226,23 +255,28 @@ public:
void mouseUp(const WebMouseEvent&);
void mouseContextMenu(const WebMouseEvent&);
void mouseDoubleClick(const WebMouseEvent&);
- void mouseWheel(const WebMouseWheelEvent&);
+ bool mouseWheel(const WebMouseWheelEvent&);
bool keyEvent(const WebKeyboardEvent&);
bool charEvent(const WebKeyboardEvent&);
+ bool touchEvent(const WebTouchEvent&);
// Handles context menu events orignated via the the keyboard. These
- // include the VK_APPS virtual key and the Shift+F10 combine. Code is
+ // include the VK_APPS virtual key and the Shift+F10 combine. Code is
// based on the Webkit function bool WebView::handleContextMenuEvent(WPARAM
// wParam, LPARAM lParam) in webkit\webkit\win\WebView.cpp. The only
// significant change in this function is the code to convert from a
// Keyboard event to the Right Mouse button down event.
bool sendContextMenuEvent(const WebKeyboardEvent&);
- // Notifies the WebView that a load has been committed. isNewNavigation
+ // Notifies the WebView that a load has been committed. isNewNavigation
// will be true if a new session history item should be created for that
// load.
void didCommitLoad(bool* isNewNavigation);
+ // Returns true if popup menus should be rendered by the browser, false if
+ // they should be rendered by WebKit (which is the default).
+ static bool useExternalPopupMenus();
+
bool contextMenuAllowed() const
{
return m_contextMenuAllowed;
@@ -270,13 +304,14 @@ public:
// Start a system drag and drop operation.
void startDragging(
- const WebPoint& eventPos,
const WebDragData& dragData,
- WebDragOperationsMask dragSourceOperationMask);
+ WebDragOperationsMask mask,
+ const WebImage& dragImage,
+ const WebPoint& dragImageOffset);
- void suggestionsPopupDidHide()
+ void autoFillPopupDidHide()
{
- m_suggestionsPopupShowing = false;
+ m_autoFillPopupShowing = false;
}
#if ENABLE(NOTIFICATIONS)
@@ -288,39 +323,96 @@ public:
// was scrolled.
bool propagateScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
- // HACK: currentInputEvent() is for ChromeClientImpl::show(), until we can
- // fix WebKit to pass enough information up into ChromeClient::show() so we
- // can decide if the window.open event was caused by a middle-mouse click
+ // Notification that a popup was opened/closed.
+ void popupOpened(WebCore::PopupContainer* popupContainer);
+ void popupClosed(WebCore::PopupContainer* popupContainer);
+
+ void hideAutoFillPopup();
+
+ // Returns the input event we're currently processing. This is used in some
+ // cases where the WebCore DOM event doesn't have the information we need.
static const WebInputEvent* currentInputEvent()
{
return m_currentInputEvent;
}
+#if USE(ACCELERATED_COMPOSITING)
+ bool allowsAcceleratedCompositing();
+ void setRootGraphicsLayer(WebCore::PlatformLayer*);
+ void setRootLayerNeedsDisplay();
+ void scrollRootLayerRect(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& clipRect);
+ void invalidateRootLayerRect(const WebCore::IntRect&);
+#endif
+
+ // Returns the onscreen 3D context used by the compositor. This is
+ // used by the renderer's code to set up resource sharing between
+ // the compositor's context and subordinate contexts for APIs like
+ // WebGL. Returns 0 if compositing support is not compiled in.
+ virtual WebGraphicsContext3D* graphicsContext3D();
+
+ WebCore::PopupContainer* selectPopup() const { return m_selectPopup.get(); }
+
+ // Returns true if the event leads to scrolling.
+ static bool mapKeyCodeForScroll(int keyCode,
+ WebCore::ScrollDirection* scrollDirection,
+ WebCore::ScrollGranularity* scrollGranularity);
+
+ // Called by a full frame plugin inside this view to inform it that its
+ // zoom level has been updated. The plugin should only call this function
+ // if the zoom change was triggered by the browser, it's only needed in case
+ // a plugin can update its own zoom, say because of its own UI.
+ void fullFramePluginZoomLevelChanged(double zoomLevel);
+
private:
friend class WebView; // So WebView::Create can call our constructor
friend class WTF::RefCounted<WebViewImpl>;
- WebViewImpl(WebViewClient* client);
+ enum DragAction {
+ DragEnter,
+ DragOver
+ };
+
+ WebViewImpl(WebViewClient* client, WebDevToolsAgentClient* devToolsClient);
~WebViewImpl();
// Returns true if the event was actually processed.
bool keyEventDefault(const WebKeyboardEvent&);
+ // Returns true if the select popup has consumed the event.
+ bool selectPopupHandleKeyEvent(const WebKeyboardEvent&);
+
// Returns true if the autocomple has consumed the event.
bool autocompleteHandleKeyEvent(const WebKeyboardEvent&);
- // Repaints the suggestions popup. Should be called when the suggestions
- // have changed. Note that this should only be called when the suggestions
+ // Repaints the AutoFill popup. Should be called when the suggestions
+ // have changed. Note that this should only be called when the AutoFill
// popup is showing.
- void refreshSuggestionsPopup();
+ void refreshAutoFillPopup();
// Returns true if the view was scrolled.
bool scrollViewWithKeyboard(int keyCode, int modifiers);
+ void hideSelectPopup();
+
// Converts |pos| from window coordinates to contents coordinates and gets
// the HitTestResult for it.
WebCore::HitTestResult hitTestResultForWindowPos(const WebCore::IntPoint&);
+ // Consolidate some common code between starting a drag over a target and
+ // updating a drag over a target. If we're starting a drag, |isEntering|
+ // should be true.
+ WebDragOperation dragTargetDragEnterOrOver(const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ DragAction);
+
+#if USE(ACCELERATED_COMPOSITING)
+ void setIsAcceleratedCompositingActive(bool);
+ void updateRootLayerContents(const WebCore::IntRect&);
+ void doComposite();
+ void doPixelReadbackToCanvas(WebCanvas*, const WebCore::IntRect&);
+ void reallocateRenderer();
+#endif
+
WebViewClient* m_client;
BackForwardListClientImpl m_backForwardListClientImpl;
@@ -335,7 +427,7 @@ private:
WebPoint m_lastMousePosition;
OwnPtr<WebCore::Page> m_page;
- // This flag is set when a new navigation is detected. It is used to satisfy
+ // This flag is set when a new navigation is detected. It is used to satisfy
// the corresponding argument to WebFrameClient::didCommitProvisionalLoad.
bool m_observedNewNavigation;
#ifndef NDEBUG
@@ -345,7 +437,7 @@ private:
#endif
// An object that can be used to manipulate m_page->settings() without linking
- // against WebCore. This is lazily allocated the first time GetWebSettings()
+ // against WebCore. This is lazily allocated the first time GetWebSettings()
// is called.
OwnPtr<WebSettingsImpl> m_webSettings;
@@ -361,9 +453,13 @@ private:
// dragged by the time a drag is initiated.
WebPoint m_lastMouseDownPoint;
- // Keeps track of the current zoom level. 0 means no zoom, positive numbers
+ // Keeps track of the current zoom level. 0 means no zoom, positive numbers
// mean zoom in, negative numbers mean zoom out.
- int m_zoomLevel;
+ double m_zoomLevel;
+
+ double m_minimumZoomLevel;
+
+ double m_maximumZoomLevel;
bool m_contextMenuAllowed;
@@ -391,7 +487,7 @@ private:
// copied from the WebDropData object sent from the browser process.
int m_dragIdentity;
- // Valid when m_dragTargetDispatch is true. Used to override the default
+ // Valid when m_dragTargetDispatch is true. Used to override the default
// browser drop effect with the effects "none" or "copy".
enum DragTargetDropEffect {
DropEffectDefault = -1,
@@ -407,28 +503,17 @@ private:
// current drop target in this WebView (the drop target can accept the drop).
WebDragOperation m_dragOperation;
- // Whether a suggestions popup is currently showing.
- bool m_suggestionsPopupShowing;
-
- // A pointer to the current suggestions popup menu client. This can be
- // either an AutoFillPopupMenuClient or an AutocompletePopupMenuClient. We
- // do not own this pointer.
- SuggestionsPopupMenuClient* m_suggestionsPopupClient;
+ // Whether an AutoFill popup is currently showing.
+ bool m_autoFillPopupShowing;
// The AutoFill popup client.
OwnPtr<AutoFillPopupMenuClient> m_autoFillPopupClient;
- // The Autocomplete popup client.
- OwnPtr<AutocompletePopupMenuClient> m_autocompletePopupClient;
-
- // A pointer to the current suggestions popup. We do not own this pointer.
- WebCore::PopupContainer* m_suggestionsPopup;
-
- // The AutoFill suggestions popup.
+ // The AutoFill popup.
RefPtr<WebCore::PopupContainer> m_autoFillPopup;
- // The AutoComplete suggestions popup.
- RefPtr<WebCore::PopupContainer> m_autocompletePopup;
+ // The popup associated with a select element.
+ RefPtr<WebCore::PopupContainer> m_selectPopup;
OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent;
@@ -441,12 +526,35 @@ private:
// Inspector settings.
WebString m_inspectorSettings;
+ typedef HashMap<WTF::String, WTF::String> SettingsMap;
+ OwnPtr<SettingsMap> m_inspectorSettingsMap;
+ OwnPtr<DragScrollTimer> m_dragScrollTimer;
+
#if ENABLE(NOTIFICATIONS)
// The provider of desktop notifications;
NotificationPresenterImpl m_notificationPresenter;
#endif
+ // If set, the (plugin) node which has mouse capture.
+ RefPtr<WebCore::Node> m_mouseCaptureNode;
+
+#if USE(ACCELERATED_COMPOSITING)
+ WebCore::IntRect m_rootLayerDirtyRect;
+ WebCore::IntRect m_rootLayerScrollDamage;
+ RefPtr<WebCore::LayerRendererChromium> m_layerRenderer;
+ bool m_isAcceleratedCompositingActive;
+ bool m_compositorCreationFailed;
+#endif
static const WebInputEvent* m_currentInputEvent;
+
+#if ENABLE(INPUT_SPEECH)
+ OwnPtr<SpeechInputClientImpl> m_speechInputClient;
+#endif
+ // If we attempt to fetch the on-screen GraphicsContext3D before
+ // the compositor has been turned on, we need to instantiate it
+ // early. This member holds on to the GC3D in this case.
+ RefPtr<WebCore::GraphicsContext3D> m_temporaryOnscreenGraphicsContext3D;
+ OwnPtr<DeviceOrientationClientProxy> m_deviceOrientationClientProxy;
};
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebWorkerBase.cpp b/WebKit/chromium/src/WebWorkerBase.cpp
index 40019e8..de4858c 100644
--- a/WebKit/chromium/src/WebWorkerBase.cpp
+++ b/WebKit/chromium/src/WebWorkerBase.cpp
@@ -31,17 +31,24 @@
#include "config.h"
#include "WebWorkerBase.h"
-#include "GenericWorkerTask.h"
+#include "CrossThreadTask.h"
+#include "DatabaseTask.h"
#include "MessagePortChannel.h"
#include "PlatformMessagePortChannel.h"
#include "WebDataSourceImpl.h"
+#include "WebFileError.h"
#include "WebFrameClient.h"
#include "WebFrameImpl.h"
#include "WebMessagePortChannel.h"
+#include "WebRuntimeFeatures.h"
+#include "WebSettings.h"
#include "WebView.h"
#include "WebWorkerClient.h"
+#include "WorkerContext.h"
+#include "WorkerFileSystemCallbacksBridge.h"
+#include "WorkerScriptController.h"
#include "WorkerThread.h"
#include <wtf/MainThread.h>
@@ -51,30 +58,69 @@ namespace WebKit {
#if ENABLE(WORKERS)
-// Dummy WebViewDelegate - we only need it in Worker process to load a
-// 'shadow page' which will initialize WebCore loader.
-class WorkerWebFrameClient : public WebFrameClient {
+static const char allowDatabaseMode[] = "allowDatabaseMode";
+static const char openFileSystemMode[] = "openFileSystemMode";
+
+namespace {
+
+// This class is used to route the result of the WebWorkerBase::allowDatabase
+// call back to the worker context.
+class AllowDatabaseMainThreadBridge : public ThreadSafeShared<AllowDatabaseMainThreadBridge> {
public:
- // Tell the loader to load the data into the 'shadow page' synchronously,
- // so we can grab the resulting Document right after load.
- virtual void didCreateDataSource(WebFrame* frame, WebDataSource* ds)
+ static PassRefPtr<AllowDatabaseMainThreadBridge> create(WebWorkerBase* worker, const WTF::String& mode, WebCommonWorkerClient* commonClient, WebFrame* frame, const WTF::String& name, const WTF::String& displayName, unsigned long estimatedSize)
{
- static_cast<WebDataSourceImpl*>(ds)->setDeferMainResourceDataLoad(false);
+ return adoptRef(new AllowDatabaseMainThreadBridge(worker, mode, commonClient, frame, name, displayName, estimatedSize));
}
- // Lazy allocate and leak this instance.
- static WorkerWebFrameClient* sharedInstance()
+ // These methods are invoked on the worker context.
+ void cancel()
{
- static WorkerWebFrameClient client;
- return &client;
+ MutexLocker locker(m_mutex);
+ m_worker = 0;
+ }
+
+ bool result()
+ {
+ return m_result;
+ }
+
+ // This method is invoked on the main thread.
+ void signalCompleted(bool result)
+ {
+ MutexLocker locker(m_mutex);
+ if (m_worker)
+ m_worker->postTaskForModeToWorkerContext(createCallbackTask(&didComplete, this, result), m_mode);
}
private:
- WorkerWebFrameClient()
+ AllowDatabaseMainThreadBridge(WebWorkerBase* worker, const WTF::String& mode, WebCommonWorkerClient* commonClient, WebFrame* frame, const WTF::String& name, const WTF::String& displayName, unsigned long estimatedSize)
+ : m_worker(worker)
+ , m_mode(mode)
+ {
+ worker->dispatchTaskToMainThread(createCallbackTask(&allowDatabaseTask, commonClient, frame, String(name), String(displayName), estimatedSize, this));
+ }
+
+ static void allowDatabaseTask(WebCore::ScriptExecutionContext* context, WebCommonWorkerClient* commonClient, WebFrame* frame, const WTF::String name, const WTF::String displayName, unsigned long estimatedSize, PassRefPtr<AllowDatabaseMainThreadBridge> bridge)
+ {
+ if (!commonClient)
+ bridge->signalCompleted(false);
+ else
+ bridge->signalCompleted(commonClient->allowDatabase(frame, name, displayName, estimatedSize));
+ }
+
+ static void didComplete(WebCore::ScriptExecutionContext* context, PassRefPtr<AllowDatabaseMainThreadBridge> bridge, bool result)
{
+ bridge->m_result = result;
}
+
+ bool m_result;
+ Mutex m_mutex;
+ WebWorkerBase* m_worker;
+ WTF::String m_mode;
};
+}
+
// This function is called on the main thread to force to initialize some static
// values used in WebKit before any worker thread is started. This is because in
// our worker processs, we do not run any WebKit code in main thread and thus
@@ -103,6 +149,9 @@ WebWorkerBase::WebWorkerBase()
WebWorkerBase::~WebWorkerBase()
{
ASSERT(m_webView);
+ WebFrameImpl* webFrame = static_cast<WebFrameImpl*>(m_webView->mainFrame());
+ if (webFrame)
+ webFrame->setClient(0);
m_webView->close();
}
@@ -121,8 +170,9 @@ void WebWorkerBase::initializeLoader(const WebURL& url)
// loading requests from the worker context to the rest of WebKit and Chromium
// infrastructure.
ASSERT(!m_webView);
- m_webView = WebView::create(0);
- m_webView->initializeMainFrame(WorkerWebFrameClient::sharedInstance());
+ m_webView = WebView::create(0, 0);
+ m_webView->settings()->setOfflineWebApplicationCacheEnabled(WebRuntimeFeatures::isApplicationCacheEnabled());
+ m_webView->initializeMainFrame(this);
WebFrameImpl* webFrame = static_cast<WebFrameImpl*>(m_webView->mainFrame());
@@ -140,7 +190,7 @@ void WebWorkerBase::initializeLoader(const WebURL& url)
void WebWorkerBase::dispatchTaskToMainThread(PassOwnPtr<ScriptExecutionContext::Task> task)
{
- return callOnMainThread(invokeTaskMethod, task.release());
+ callOnMainThread(invokeTaskMethod, task.leakPtr());
}
void WebWorkerBase::invokeTaskMethod(void* param)
@@ -151,6 +201,62 @@ void WebWorkerBase::invokeTaskMethod(void* param)
delete task;
}
+void WebWorkerBase::didCreateDataSource(WebFrame*, WebDataSource* ds)
+{
+ // Tell the loader to load the data into the 'shadow page' synchronously,
+ // so we can grab the resulting Document right after load.
+ static_cast<WebDataSourceImpl*>(ds)->setDeferMainResourceDataLoad(false);
+}
+
+WebApplicationCacheHost* WebWorkerBase::createApplicationCacheHost(WebFrame*, WebApplicationCacheHostClient* appcacheHostClient)
+{
+ if (commonClient())
+ return commonClient()->createApplicationCacheHost(appcacheHostClient);
+ return 0;
+}
+
+bool WebWorkerBase::allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize)
+{
+ WorkerRunLoop& runLoop = m_workerThread->runLoop();
+ WorkerScriptController* controller = WorkerScriptController::controllerForContext();
+ WorkerContext* workerContext = controller->workerContext();
+
+ // Create a unique mode just for this synchronous call.
+ String mode = allowDatabaseMode;
+ mode.append(String::number(runLoop.createUniqueId()));
+
+ RefPtr<AllowDatabaseMainThreadBridge> bridge = AllowDatabaseMainThreadBridge::create(this, mode, commonClient(), m_webView->mainFrame(), String(name), String(displayName), estimatedSize);
+
+ // Either the bridge returns, or the queue gets terminated.
+ if (runLoop.runInMode(workerContext, mode) == MessageQueueTerminated) {
+ bridge->cancel();
+ return false;
+ }
+
+ return bridge->result();
+}
+
+#if ENABLE(FILE_SYSTEM)
+void WebWorkerBase::openFileSystem(WebFileSystem::Type type, long long size, WebFileSystemCallbacks* callbacks, bool synchronous)
+{
+ WorkerRunLoop& runLoop = m_workerThread->runLoop();
+ WorkerScriptController* controller = WorkerScriptController::controllerForContext();
+ WorkerContext* workerContext = controller->workerContext();
+
+ // Create a unique mode for this openFileSystem call.
+ String mode = openFileSystemMode;
+ mode.append(String::number(runLoop.createUniqueId()));
+
+ RefPtr<WorkerFileSystemCallbacksBridge> bridge = WorkerFileSystemCallbacksBridge::create(this, workerContext, callbacks);
+ bridge->postOpenFileSystemToMainThread(commonClient(), type, size, mode);
+
+ if (synchronous) {
+ if (runLoop.runInMode(workerContext, mode) == MessageQueueTerminated)
+ bridge->stop();
+ }
+}
+#endif
+
// WorkerObjectProxy -----------------------------------------------------------
void WebWorkerBase::postMessageToWorkerObject(PassRefPtr<SerializedScriptValue> message,
@@ -199,8 +305,7 @@ void WebWorkerBase::postExceptionTask(ScriptExecutionContext* context,
sourceURL);
}
-void WebWorkerBase::postConsoleMessageToWorkerObject(MessageDestination destination,
- MessageSource source,
+void WebWorkerBase::postConsoleMessageToWorkerObject(MessageSource source,
MessageType type,
MessageLevel level,
const String& message,
@@ -208,16 +313,13 @@ void WebWorkerBase::postConsoleMessageToWorkerObject(MessageDestination destinat
const String& sourceURL)
{
dispatchTaskToMainThread(createCallbackTask(&postConsoleMessageTask, this,
- static_cast<int>(destination),
- static_cast<int>(source),
- static_cast<int>(type),
- static_cast<int>(level),
+ source, type, level,
message, lineNumber, sourceURL));
}
void WebWorkerBase::postConsoleMessageTask(ScriptExecutionContext* context,
WebWorkerBase* thisPtr,
- int destination, int source,
+ int source,
int type, int level,
const String& message,
int lineNumber,
@@ -225,7 +327,7 @@ void WebWorkerBase::postConsoleMessageTask(ScriptExecutionContext* context,
{
if (!thisPtr->commonClient())
return;
- thisPtr->commonClient()->postConsoleMessageToWorkerObject(destination, source,
+ thisPtr->commonClient()->postConsoleMessageToWorkerObject(source,
type, level, message,
lineNumber, sourceURL);
}
diff --git a/WebKit/chromium/src/WebWorkerBase.h b/WebKit/chromium/src/WebWorkerBase.h
index 0217401..fe84bf7 100644
--- a/WebKit/chromium/src/WebWorkerBase.h
+++ b/WebKit/chromium/src/WebWorkerBase.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -34,6 +34,7 @@
#if ENABLE(WORKERS)
#include "ScriptExecutionContext.h"
+#include "WebFrameClient.h"
#include "WorkerLoaderProxy.h"
#include "WorkerObjectProxy.h"
#include <wtf/PassOwnPtr.h>
@@ -44,16 +45,22 @@ class WorkerThread;
}
namespace WebKit {
+class WebApplicationCacheHost;
+class WebApplicationCacheHostClient;
class WebCommonWorkerClient;
+class WebSecurityOrigin;
+class WebString;
class WebURL;
class WebView;
+class WebWorker;
class WebWorkerClient;
// Base class for WebSharedWorkerImpl and WebWorkerImpl. It contains common
// code used by both implementation classes, including implementations of the
// WorkerObjectProxy and WorkerLoaderProxy interfaces.
class WebWorkerBase : public WebCore::WorkerObjectProxy
- , public WebCore::WorkerLoaderProxy {
+ , public WebCore::WorkerLoaderProxy
+ , public WebFrameClient {
public:
WebWorkerBase();
virtual ~WebWorkerBase();
@@ -63,10 +70,10 @@ public:
PassRefPtr<WebCore::SerializedScriptValue>,
PassOwnPtr<WebCore::MessagePortChannelArray>);
virtual void postExceptionToWorkerObject(
- const WebCore::String&, int, const WebCore::String&);
+ const WTF::String&, int, const WTF::String&);
virtual void postConsoleMessageToWorkerObject(
- WebCore::MessageDestination, WebCore::MessageSource, WebCore::MessageType,
- WebCore::MessageLevel, const WebCore::String&, int, const WebCore::String&);
+ WebCore::MessageSource, WebCore::MessageType,
+ WebCore::MessageLevel, const WTF::String&, int, const WTF::String&);
virtual void confirmMessageFromWorkerObject(bool);
virtual void reportPendingActivity(bool);
virtual void workerContextClosed();
@@ -75,7 +82,19 @@ public:
// WebCore::WorkerLoaderProxy methods:
virtual void postTaskToLoader(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
virtual void postTaskForModeToWorkerContext(
- PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const WebCore::String& mode);
+ PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const WTF::String& mode);
+
+ // WebFrameClient methods to support resource loading thru the 'shadow page'.
+ virtual void didCreateDataSource(WebFrame*, WebDataSource*);
+ virtual WebApplicationCacheHost* createApplicationCacheHost(WebFrame*, WebApplicationCacheHostClient*);
+
+ // Controls whether access to Web Databases is allowed for this worker.
+ virtual bool allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize);
+
+#if ENABLE(FILE_SYSTEM)
+ // Requests to open a file system for this worker. (Note that this is not the implementation for WebFrameClient::openFileSystem.)
+ void openFileSystem(WebFileSystem::Type, long long size, WebFileSystemCallbacks*, bool synchronous);
+#endif
// Executes the given task on the main thread.
static void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
@@ -101,24 +120,23 @@ private:
static void postMessageTask(
WebCore::ScriptExecutionContext* context,
WebWorkerBase* thisPtr,
- WebCore::String message,
+ WTF::String message,
PassOwnPtr<WebCore::MessagePortChannelArray> channels);
static void postExceptionTask(
WebCore::ScriptExecutionContext* context,
WebWorkerBase* thisPtr,
- const WebCore::String& message,
+ const WTF::String& message,
int lineNumber,
- const WebCore::String& sourceURL);
+ const WTF::String& sourceURL);
static void postConsoleMessageTask(
WebCore::ScriptExecutionContext* context,
WebWorkerBase* thisPtr,
- int destination,
int source,
int type,
int level,
- const WebCore::String& message,
+ const WTF::String& message,
int lineNumber,
- const WebCore::String& sourceURL);
+ const WTF::String& sourceURL);
static void confirmMessageTask(
WebCore::ScriptExecutionContext* context,
WebWorkerBase* thisPtr,
diff --git a/WebKit/chromium/src/WebWorkerClientImpl.cpp b/WebKit/chromium/src/WebWorkerClientImpl.cpp
index 598a078..18282e3 100644
--- a/WebKit/chromium/src/WebWorkerClientImpl.cpp
+++ b/WebKit/chromium/src/WebWorkerClientImpl.cpp
@@ -33,11 +33,11 @@
#if ENABLE(WORKERS)
+#include "CrossThreadTask.h"
#include "DedicatedWorkerThread.h"
#include "ErrorEvent.h"
#include "Frame.h"
#include "FrameLoaderClient.h"
-#include "GenericWorkerTask.h"
#include "MessageEvent.h"
#include "MessagePort.h"
#include "MessagePortChannel.h"
@@ -45,6 +45,7 @@
#include "Worker.h"
#include "WorkerContext.h"
#include "WorkerContextExecutionProxy.h"
+#include "WorkerScriptController.h"
#include "WorkerMessagingProxy.h"
#include <wtf/Threading.h>
@@ -94,15 +95,13 @@ WorkerContextProxy* WebWorkerClientImpl::createWorkerContextProxy(Worker* worker
WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame());
webWorker = webFrame->client()->createWorker(webFrame, proxy);
} else {
- WorkerContextExecutionProxy* currentContext =
- WorkerContextExecutionProxy::retrieve();
- if (!currentContext) {
+ WorkerScriptController* controller = WorkerScriptController::controllerForContext();
+ if (!controller) {
ASSERT_NOT_REACHED();
return 0;
}
- DedicatedWorkerThread* thread =
- static_cast<DedicatedWorkerThread*>(currentContext->workerContext()->thread());
+ DedicatedWorkerThread* thread = static_cast<DedicatedWorkerThread*>(controller->workerContext()->thread());
WorkerObjectProxy* workerObjectProxy = &thread->workerObjectProxy();
WebWorkerImpl* impl = reinterpret_cast<WebWorkerImpl*>(workerObjectProxy);
webWorker = impl->client()->createWorker(proxy);
@@ -244,15 +243,14 @@ void WebWorkerClientImpl::postExceptionToWorkerObject(const WebString& errorMess
return;
}
- bool handled = false;
- handled = m_worker->dispatchEvent(ErrorEvent::create(errorMessage,
- sourceURL,
- lineNumber));
- if (!handled)
+ bool unhandled = m_worker->dispatchEvent(ErrorEvent::create(errorMessage,
+ sourceURL,
+ lineNumber));
+ if (unhandled)
m_scriptExecutionContext->reportException(errorMessage, lineNumber, sourceURL);
}
-void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int destinationId,
+void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int destination,
int sourceId,
int messageType,
int messageLevel,
@@ -263,7 +261,6 @@ void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int destinationId,
if (currentThread() != m_workerThreadId) {
m_scriptExecutionContext->postTask(createCallbackTask(&postConsoleMessageToWorkerObjectTask,
this,
- destinationId,
sourceId,
messageType,
messageLevel,
@@ -273,14 +270,23 @@ void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int destinationId,
return;
}
- m_scriptExecutionContext->addMessage(static_cast<MessageDestination>(destinationId),
- static_cast<MessageSource>(sourceId),
+ m_scriptExecutionContext->addMessage(static_cast<MessageSource>(sourceId),
static_cast<MessageType>(messageType),
static_cast<MessageLevel>(messageLevel),
String(message), lineNumber,
String(sourceURL));
}
+void WebWorkerClientImpl::postConsoleMessageToWorkerObject(int sourceId,
+ int messageType,
+ int messageLevel,
+ const WebString& message,
+ int lineNumber,
+ const WebString& sourceURL)
+{
+ postConsoleMessageToWorkerObject(0, sourceId, messageType, messageLevel, message, lineNumber, sourceURL);
+}
+
void WebWorkerClientImpl::confirmMessageFromWorkerObject(bool hasPendingActivity)
{
// unconfirmed_message_count_ can only be updated on the thread where it's
@@ -354,7 +360,7 @@ void WebWorkerClientImpl::postMessageToWorkerObjectTask(
if (thisPtr->m_worker) {
OwnPtr<MessagePortArray> ports =
- MessagePort::entanglePorts(*context, channels.release());
+ MessagePort::entanglePorts(*context, channels);
RefPtr<SerializedScriptValue> serializedMessage =
SerializedScriptValue::createFromWire(message);
thisPtr->m_worker->dispatchEvent(MessageEvent::create(ports.release(),
@@ -382,7 +388,6 @@ void WebWorkerClientImpl::postExceptionToWorkerObjectTask(
void WebWorkerClientImpl::postConsoleMessageToWorkerObjectTask(ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr,
- int destinationId,
int sourceId,
int messageType,
int messageLevel,
@@ -390,8 +395,7 @@ void WebWorkerClientImpl::postConsoleMessageToWorkerObjectTask(ScriptExecutionCo
int lineNumber,
const String& sourceURL)
{
- thisPtr->m_scriptExecutionContext->addMessage(static_cast<MessageDestination>(destinationId),
- static_cast<MessageSource>(sourceId),
+ thisPtr->m_scriptExecutionContext->addMessage(static_cast<MessageSource>(sourceId),
static_cast<MessageType>(messageType),
static_cast<MessageLevel>(messageLevel),
message, lineNumber,
diff --git a/WebKit/chromium/src/WebWorkerClientImpl.h b/WebKit/chromium/src/WebWorkerClientImpl.h
index 63acebc..0604823 100644
--- a/WebKit/chromium/src/WebWorkerClientImpl.h
+++ b/WebKit/chromium/src/WebWorkerClientImpl.h
@@ -33,9 +33,8 @@
#if ENABLE(WORKERS)
-// FIXME: fix to just "WebWorkerClient.h" once nobody in glue depends on us.
-#include "../public/WebWorkerClient.h"
-
+#include "WebFileSystem.h"
+#include "WebWorkerClient.h"
#include "WorkerContextProxy.h"
#include <wtf/PassOwnPtr.h>
#include <wtf/RefPtr.h>
@@ -65,8 +64,8 @@ public:
// process, this will be the main WebKit thread. In the worker process, this
// will be the thread of the executing worker (not the main WebKit thread).
virtual void startWorkerContext(const WebCore::KURL&,
- const WebCore::String&,
- const WebCore::String&);
+ const WTF::String&,
+ const WTF::String&);
virtual void terminateWorkerContext();
virtual void postMessageToWorkerContext(
PassRefPtr<WebCore::SerializedScriptValue> message,
@@ -78,8 +77,12 @@ public:
// These are called on the main WebKit thread.
virtual void postMessageToWorkerObject(const WebString&, const WebMessagePortChannelArray&);
virtual void postExceptionToWorkerObject(const WebString&, int, const WebString&);
- virtual void postConsoleMessageToWorkerObject(int, int, int, int, const WebString&,
- int, const WebString&);
+
+ // FIXME: the below is for compatibility only and should be
+ // removed once Chromium is updated to remove message
+ // destination parameter <http://webkit.org/b/37155>.
+ virtual void postConsoleMessageToWorkerObject(int, int, int, int, const WebString&, int, const WebString&);
+ virtual void postConsoleMessageToWorkerObject(int, int, int, const WebString&, int, const WebString&);
virtual void confirmMessageFromWorkerObject(bool);
virtual void reportPendingActivity(bool);
virtual void workerContextClosed();
@@ -90,6 +93,16 @@ public:
// FIXME: Notifications not yet supported in workers.
return 0;
}
+ virtual WebApplicationCacheHost* createApplicationCacheHost(WebApplicationCacheHostClient*) { return 0; }
+ virtual bool allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize)
+ {
+ ASSERT_NOT_REACHED();
+ return true;
+ }
+ virtual void openFileSystem(WebFrame*, WebFileSystem::Type, long long size, WebFileSystemCallbacks*)
+ {
+ ASSERT_NOT_REACHED();
+ }
private:
virtual ~WebWorkerClientImpl();
@@ -99,14 +112,14 @@ private:
// These tasks are dispatched on the WebKit thread.
static void startWorkerContextTask(WebCore::ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr,
- const WebCore::String& scriptURL,
- const WebCore::String& userAgent,
- const WebCore::String& sourceCode);
+ const WTF::String& scriptURL,
+ const WTF::String& userAgent,
+ const WTF::String& sourceCode);
static void terminateWorkerContextTask(WebCore::ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr);
static void postMessageToWorkerContextTask(WebCore::ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr,
- const WebCore::String& message,
+ const WTF::String& message,
PassOwnPtr<WebCore::MessagePortChannelArray> channels);
static void workerObjectDestroyedTask(WebCore::ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr);
@@ -116,22 +129,21 @@ private:
// worker process).
static void postMessageToWorkerObjectTask(WebCore::ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr,
- const WebCore::String& message,
+ const WTF::String& message,
PassOwnPtr<WebCore::MessagePortChannelArray> channels);
static void postExceptionToWorkerObjectTask(WebCore::ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr,
- const WebCore::String& message,
+ const WTF::String& message,
int lineNumber,
- const WebCore::String& sourceURL);
+ const WTF::String& sourceURL);
static void postConsoleMessageToWorkerObjectTask(WebCore::ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr,
- int destinationId,
int sourceId,
int messageType,
int messageLevel,
- const WebCore::String& message,
+ const WTF::String& message,
int lineNumber,
- const WebCore::String& sourceURL);
+ const WTF::String& sourceURL);
static void confirmMessageFromWorkerObjectTask(WebCore::ScriptExecutionContext* context,
WebWorkerClientImpl* thisPtr);
static void reportPendingActivityTask(WebCore::ScriptExecutionContext* context,
diff --git a/WebKit/chromium/src/WebWorkerImpl.cpp b/WebKit/chromium/src/WebWorkerImpl.cpp
index 5b5e053..165af68 100644
--- a/WebKit/chromium/src/WebWorkerImpl.cpp
+++ b/WebKit/chromium/src/WebWorkerImpl.cpp
@@ -31,9 +31,9 @@
#include "config.h"
#include "WebWorkerImpl.h"
+#include "CrossThreadTask.h"
#include "DedicatedWorkerContext.h"
#include "DedicatedWorkerThread.h"
-#include "GenericWorkerTask.h"
#include "KURL.h"
#include "MessageEvent.h"
#include "MessagePort.h"
@@ -86,7 +86,7 @@ void WebWorkerImpl::postMessageToWorkerContextTask(WebCore::ScriptExecutionConte
static_cast<DedicatedWorkerContext*>(context);
OwnPtr<MessagePortArray> ports =
- MessagePort::entanglePorts(*context, channels.release());
+ MessagePort::entanglePorts(*context, channels);
RefPtr<SerializedScriptValue> serializedMessage =
SerializedScriptValue::createFromWire(message);
workerContext->dispatchEvent(MessageEvent::create(
diff --git a/WebKit/chromium/src/WebWorkerImpl.h b/WebKit/chromium/src/WebWorkerImpl.h
index bec96cd..d2fd016 100644
--- a/WebKit/chromium/src/WebWorkerImpl.h
+++ b/WebKit/chromium/src/WebWorkerImpl.h
@@ -69,7 +69,7 @@ private:
static void postMessageToWorkerContextTask(
WebCore::ScriptExecutionContext* context,
WebWorkerImpl* thisPtr,
- const WebCore::String& message,
+ const WTF::String& message,
PassOwnPtr<WebCore::MessagePortChannelArray> channels);
WebWorkerClient* m_client;
diff --git a/WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp b/WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp
new file mode 100644
index 0000000..058e947
--- /dev/null
+++ b/WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WorkerAsyncFileSystemChromium.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileSystemCallbacks.h"
+#include "FileMetadata.h"
+#include "FileSystem.h"
+#include "NotImplemented.h"
+#include "WebFileSystem.h"
+#include "WebFileSystemCallbacksImpl.h"
+#include "WebFileWriter.h"
+#include "WebKit.h"
+#include "WebKitClient.h"
+#include "WebWorkerBase.h"
+#include "WorkerAsyncFileWriterChromium.h"
+#include "WorkerContext.h"
+#include "WorkerFileSystemCallbacksBridge.h"
+#include "WorkerScriptController.h"
+#include "WorkerThread.h"
+#include <wtf/text/CString.h>
+
+using namespace WebKit;
+
+namespace WebCore {
+
+static const char fileSystemOperationsMode[] = "fileSystemOperationsMode";
+
+WorkerAsyncFileSystemChromium::WorkerAsyncFileSystemChromium(ScriptExecutionContext* context, const String& rootPath, bool synchronous)
+ : AsyncFileSystem(rootPath)
+ , m_scriptExecutionContext(context)
+ , m_webFileSystem(WebKit::webKitClient()->fileSystem())
+ , m_workerContext(static_cast<WorkerContext*>(context))
+ , m_synchronous(synchronous)
+{
+ ASSERT(m_webFileSystem);
+ ASSERT(m_scriptExecutionContext->isWorkerContext());
+
+ WorkerLoaderProxy* workerLoaderProxy = &m_workerContext->thread()->workerLoaderProxy();
+ m_worker = static_cast<WebWorkerBase*>(workerLoaderProxy);
+}
+
+WorkerAsyncFileSystemChromium::~WorkerAsyncFileSystemChromium()
+{
+}
+
+bool WorkerAsyncFileSystemChromium::waitForOperationToComplete()
+{
+ if (!m_bridgeForCurrentOperation.get())
+ return false;
+
+ RefPtr<WorkerFileSystemCallbacksBridge> bridge = m_bridgeForCurrentOperation.release();
+ if (m_workerContext->thread()->runLoop().runInMode(m_workerContext, m_modeForCurrentOperation) == MessageQueueTerminated) {
+ bridge->stop();
+ return false;
+ }
+ return true;
+}
+
+void WorkerAsyncFileSystemChromium::move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postMoveToMainThread(m_webFileSystem, sourcePath, destinationPath, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postCopyToMainThread(m_webFileSystem, sourcePath, destinationPath, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postRemoveToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postRemoveRecursivelyToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postReadMetadataToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postCreateFileToMainThread(m_webFileSystem, path, exclusive, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postCreateDirectoryToMainThread(m_webFileSystem, path, exclusive, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postFileExistsToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postDirectoryExistsToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postReadDirectoryToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+class WorkerFileWriterHelperCallbacks : public AsyncFileSystemCallbacks {
+public:
+ static PassOwnPtr<WorkerFileWriterHelperCallbacks> create(AsyncFileWriterClient* client, const String& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks, WorkerContext* workerContext)
+ {
+ return adoptPtr(new WorkerFileWriterHelperCallbacks(client, path, webFileSystem, callbacks, workerContext));
+ }
+
+ virtual void didSucceed()
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didReadMetadata(const FileMetadata& metadata)
+ {
+ ASSERT(m_callbacks);
+ if (metadata.type != FileMetadata::TypeFile || metadata.length < 0)
+ m_callbacks->didFail(WebKit::WebFileErrorInvalidState);
+ else {
+ OwnPtr<WorkerAsyncFileWriterChromium> asyncFileWriterChromium = WorkerAsyncFileWriterChromium::create(m_webFileSystem, m_path, m_workerContext, m_client, WorkerAsyncFileWriterChromium::Asynchronous);
+ m_callbacks->didCreateFileWriter(asyncFileWriterChromium.release(), metadata.length);
+ }
+ }
+
+ virtual void didReadDirectoryEntry(const String& name, bool isDirectory)
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didReadDirectoryEntries(bool hasMore)
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didOpenFileSystem(const String&, PassOwnPtr<AsyncFileSystem>)
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ // Called when an AsyncFileWrter has been created successfully.
+ virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long)
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didFail(int code)
+ {
+ ASSERT(m_callbacks);
+ m_callbacks->didFail(code);
+ }
+
+private:
+ WorkerFileWriterHelperCallbacks(AsyncFileWriterClient* client, const String& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks, WorkerContext* workerContext)
+ : m_client(client)
+ , m_path(path)
+ , m_webFileSystem(webFileSystem)
+ , m_callbacks(callbacks)
+ , m_workerContext(workerContext)
+ {
+ }
+
+ AsyncFileWriterClient* m_client;
+ String m_path;
+ WebKit::WebFileSystem* m_webFileSystem;
+ OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks;
+ WorkerContext* m_workerContext;
+};
+
+void WorkerAsyncFileSystemChromium::createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(WorkerFileWriterHelperCallbacks::create(client, path, m_webFileSystem, callbacks, m_workerContext))->postReadMetadataToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+PassRefPtr<WorkerFileSystemCallbacksBridge> WorkerAsyncFileSystemChromium::createWorkerFileSystemCallbacksBridge(PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ ASSERT(!m_synchronous || !m_bridgeForCurrentOperation.get());
+
+ m_modeForCurrentOperation = fileSystemOperationsMode;
+ m_modeForCurrentOperation.append(String::number(m_workerContext->thread()->runLoop().createUniqueId()));
+
+ m_bridgeForCurrentOperation = WorkerFileSystemCallbacksBridge::create(m_worker, m_scriptExecutionContext, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ return m_bridgeForCurrentOperation;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebKit/chromium/src/WorkerAsyncFileSystemChromium.h b/WebKit/chromium/src/WorkerAsyncFileSystemChromium.h
new file mode 100644
index 0000000..0b4b708
--- /dev/null
+++ b/WebKit/chromium/src/WorkerAsyncFileSystemChromium.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WorkerAsyncFileSystemChromium_h
+#define WorkerAsyncFileSystemChromium_h
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileSystem.h"
+#include "PlatformString.h"
+#include <wtf/PassOwnPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebKit {
+class WebFileSystem;
+class WebWorkerBase;
+class WorkerFileSystemCallbacksBridge;
+}
+
+namespace WebCore {
+
+class AsyncFileSystemCallbacks;
+class ScriptExecutionContext;
+class WorkerContext;
+
+class WorkerAsyncFileSystemChromium : public AsyncFileSystem {
+public:
+ static PassOwnPtr<AsyncFileSystem> create(ScriptExecutionContext* context, const String& rootPath, bool synchronous)
+ {
+ return adoptPtr(new WorkerAsyncFileSystemChromium(context, rootPath, synchronous));
+ }
+
+ virtual ~WorkerAsyncFileSystemChromium();
+
+ // Runs one pending operation (to wait for completion in the sync-mode).
+ virtual bool waitForOperationToComplete();
+
+ virtual void move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+
+private:
+ WorkerAsyncFileSystemChromium(ScriptExecutionContext*, const String& rootPath, bool synchronous);
+
+ PassRefPtr<WebKit::WorkerFileSystemCallbacksBridge> createWorkerFileSystemCallbacksBridge(PassOwnPtr<AsyncFileSystemCallbacks>);
+
+ ScriptExecutionContext* m_scriptExecutionContext;
+ WebKit::WebFileSystem* m_webFileSystem;
+ WebKit::WebWorkerBase* m_worker;
+ WorkerContext* m_workerContext;
+ RefPtr<WebKit::WorkerFileSystemCallbacksBridge> m_bridgeForCurrentOperation;
+ String m_modeForCurrentOperation;
+ bool m_synchronous;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(FILE_SYSTEM)
+
+#endif // WorkerAsyncFileSystemChromium_h
diff --git a/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp
new file mode 100644
index 0000000..0d0ac8b
--- /dev/null
+++ b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WorkerAsyncFileWriterChromium.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileSystem.h"
+#include "Blob.h"
+#include "ScriptExecutionContext.h"
+#include "WebFileSystem.h"
+#include "WebFileWriter.h"
+#include "WebURL.h"
+#include "WebWorkerBase.h"
+#include "WorkerContext.h"
+#include "WorkerFileWriterCallbacksBridge.h"
+#include "WorkerLoaderProxy.h"
+#include "WorkerThread.h"
+#include <wtf/Assertions.h>
+
+using namespace WebKit;
+
+namespace WebCore {
+
+WorkerAsyncFileWriterChromium::WorkerAsyncFileWriterChromium(WebFileSystem* webFileSystem, const String& path, WorkerContext* workerContext, AsyncFileWriterClient* client, WriterType type)
+ : m_type(type)
+{
+ ASSERT(m_type == Asynchronous); // Synchronous is not implemented yet.
+
+ WorkerLoaderProxy* proxy = &workerContext->thread()->workerLoaderProxy();
+ m_bridge = WorkerFileWriterCallbacksBridge::create(path, proxy, workerContext, client);
+}
+
+WorkerAsyncFileWriterChromium::~WorkerAsyncFileWriterChromium()
+{
+ m_bridge->postShutdownToMainThread(m_bridge);
+}
+
+bool WorkerAsyncFileWriterChromium::waitForOperationToComplete()
+{
+ return m_bridge->waitForOperationToComplete();
+}
+
+void WorkerAsyncFileWriterChromium::write(long long position, Blob* data)
+{
+ m_bridge->postWriteToMainThread(position, data->url());
+}
+
+void WorkerAsyncFileWriterChromium::truncate(long long length)
+{
+ m_bridge->postTruncateToMainThread(length);
+}
+
+void WorkerAsyncFileWriterChromium::abort()
+{
+ m_bridge->postAbortToMainThread();
+}
+
+}
+
+#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h
new file mode 100644
index 0000000..01058c3
--- /dev/null
+++ b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WorkerAsyncFileWriterChromium_h
+#define WorkerAsyncFileWriterChromium_h
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileWriter.h"
+#include <wtf/PassOwnPtr.h>
+
+namespace WebKit {
+ class WebFileSystem;
+ class WebFileWriter;
+ class WorkerFileWriterCallbacksBridge;
+}
+
+namespace WTF {
+ class String;
+}
+using WTF::String;
+
+namespace WebCore {
+
+class AsyncFileSystem;
+class AsyncFileWriterClient;
+class Blob;
+class WorkerContext;
+
+class WorkerAsyncFileWriterChromium : public AsyncFileWriter {
+public:
+ enum WriterType {
+ Asynchronous,
+ Synchronous,
+ };
+
+ static PassOwnPtr<WorkerAsyncFileWriterChromium> create(WebKit::WebFileSystem* webFileSystem, const String& path, WorkerContext* workerContext, AsyncFileWriterClient* client, WriterType type)
+ {
+ return adoptPtr(new WorkerAsyncFileWriterChromium(webFileSystem, path, workerContext, client, type));
+ }
+ ~WorkerAsyncFileWriterChromium();
+
+ bool waitForOperationToComplete();
+
+ // FileWriter
+ virtual void write(long long position, Blob* data);
+ virtual void truncate(long long length);
+ virtual void abort();
+
+private:
+
+ WorkerAsyncFileWriterChromium(WebKit::WebFileSystem*, const String& path, WorkerContext*, AsyncFileWriterClient*, WriterType);
+ RefPtr<WebKit::WorkerFileWriterCallbacksBridge> m_bridge;
+ WriterType m_type;
+};
+
+} // namespace
+
+#endif // ENABLE(FILE_SYSTEM)
+
+#endif // AsyncFileWriterChromium_h
diff --git a/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.cpp b/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.cpp
new file mode 100644
index 0000000..6c31221
--- /dev/null
+++ b/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.cpp
@@ -0,0 +1,392 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WorkerFileSystemCallbacksBridge.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "CrossThreadTask.h"
+#include "WebCommonWorkerClient.h"
+#include "WebFileInfo.h"
+#include "WebFileSystemCallbacks.h"
+#include "WebFileSystemEntry.h"
+#include "WebString.h"
+#include "WebWorkerBase.h"
+#include "WorkerContext.h"
+#include "WorkerScriptController.h"
+#include "WorkerThread.h"
+#include <wtf/MainThread.h>
+#include <wtf/Threading.h>
+
+namespace WebCore {
+
+template<> struct CrossThreadCopierBase<false, false, WebKit::WebFileInfo> {
+ typedef WebKit::WebFileInfo Type;
+ static Type copy(const WebKit::WebFileInfo& info)
+ {
+ // Perform per-field copy to make sure we don't do any (unexpected) non-thread safe copy here.
+ struct WebKit::WebFileInfo newInfo;
+ newInfo.modificationTime = info.modificationTime;
+ newInfo.length = info.length;
+ newInfo.type = info.type;
+ return newInfo;
+ }
+};
+
+template<> struct CrossThreadCopierBase<false, false, WebKit::WebVector<WebKit::WebFileSystemEntry> > {
+ typedef WebKit::WebVector<WebKit::WebFileSystemEntry> Type;
+ static Type copy(const WebKit::WebVector<WebKit::WebFileSystemEntry>& entries)
+ {
+ WebKit::WebVector<WebKit::WebFileSystemEntry> newEntries(entries.size());
+ for (size_t i = 0; i < entries.size(); ++i) {
+ String name = entries[i].name;
+ newEntries[i].isDirectory = entries[i].isDirectory;
+ newEntries[i].name = name.crossThreadString();
+ }
+ return newEntries;
+ }
+};
+
+}
+
+using namespace WebCore;
+
+namespace WebKit {
+
+// FileSystemCallbacks that are to be dispatched on the main thread.
+class MainThreadFileSystemCallbacks : public WebFileSystemCallbacks {
+public:
+ // Callbacks are self-destructed and we always return leaked pointer here.
+ static MainThreadFileSystemCallbacks* createLeakedPtr(PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const String& mode)
+ {
+ OwnPtr<MainThreadFileSystemCallbacks> callbacks = adoptPtr(new MainThreadFileSystemCallbacks(bridge, mode));
+ return callbacks.leakPtr();
+ }
+
+ virtual ~MainThreadFileSystemCallbacks()
+ {
+ }
+
+ virtual void didOpenFileSystem(const WebString& name, const WebString& path)
+ {
+ m_bridge->didOpenFileSystemOnMainThread(name, path, m_mode);
+ delete this;
+ }
+
+ virtual void didFail(WebFileError error)
+ {
+ m_bridge->didFailOnMainThread(error, m_mode);
+ delete this;
+ }
+
+ virtual void didSucceed()
+ {
+ m_bridge->didSucceedOnMainThread(m_mode);
+ delete this;
+ }
+
+ virtual void didReadMetadata(const WebFileInfo& info)
+ {
+ m_bridge->didReadMetadataOnMainThread(info, m_mode);
+ delete this;
+ }
+
+ virtual void didReadDirectory(const WebVector<WebFileSystemEntry>& entries, bool hasMore)
+ {
+ m_bridge->didReadDirectoryOnMainThread(entries, hasMore, m_mode);
+ delete this;
+ }
+
+private:
+ MainThreadFileSystemCallbacks(PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const String& mode)
+ : m_bridge(bridge)
+ , m_mode(mode)
+ {
+ ASSERT(m_bridge.get());
+ }
+
+ friend class WorkerFileSystemCallbacksBridge;
+ RefPtr<WorkerFileSystemCallbacksBridge> m_bridge;
+ const String m_mode;
+};
+
+void WorkerFileSystemCallbacksBridge::stop()
+{
+ ASSERT(m_workerContext->isContextThread());
+ MutexLocker locker(m_mutex);
+ m_worker = 0;
+
+ if (m_callbacksOnWorkerThread) {
+ m_callbacksOnWorkerThread->didFail(WebFileErrorAbort);
+ m_callbacksOnWorkerThread = 0;
+ }
+}
+
+void WorkerFileSystemCallbacksBridge::postOpenFileSystemToMainThread(WebCommonWorkerClient* commonClient, WebFileSystem::Type type, long long size, const String& mode)
+{
+ dispatchTaskToMainThread(createCallbackTask(&openFileSystemOnMainThread, commonClient, type, size, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postMoveToMainThread(WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, const String& mode)
+{
+ dispatchTaskToMainThread(createCallbackTask(&moveOnMainThread, fileSystem, sourcePath, destinationPath, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postCopyToMainThread(WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, const String& mode)
+{
+ dispatchTaskToMainThread(createCallbackTask(&copyOnMainThread, fileSystem, sourcePath, destinationPath, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postRemoveToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
+{
+ ASSERT(fileSystem);
+ dispatchTaskToMainThread(createCallbackTask(&removeOnMainThread, fileSystem, path, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postRemoveRecursivelyToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
+{
+ ASSERT(fileSystem);
+ dispatchTaskToMainThread(createCallbackTask(&removeRecursivelyOnMainThread, fileSystem, path, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postReadMetadataToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
+{
+ ASSERT(fileSystem);
+ dispatchTaskToMainThread(createCallbackTask(&readMetadataOnMainThread, fileSystem, path, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postCreateFileToMainThread(WebFileSystem* fileSystem, const String& path, bool exclusive, const String& mode)
+{
+ dispatchTaskToMainThread(createCallbackTask(&createFileOnMainThread, fileSystem, path, exclusive, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postCreateDirectoryToMainThread(WebFileSystem* fileSystem, const String& path, bool exclusive, const String& mode)
+{
+ ASSERT(fileSystem);
+ dispatchTaskToMainThread(createCallbackTask(&createDirectoryOnMainThread, fileSystem, path, exclusive, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postFileExistsToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
+{
+ ASSERT(fileSystem);
+ dispatchTaskToMainThread(createCallbackTask(&fileExistsOnMainThread, fileSystem, path, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postDirectoryExistsToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
+{
+ ASSERT(fileSystem);
+ dispatchTaskToMainThread(createCallbackTask(&directoryExistsOnMainThread, fileSystem, path, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::postReadDirectoryToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
+{
+ ASSERT(fileSystem);
+ dispatchTaskToMainThread(createCallbackTask(&readDirectoryOnMainThread, fileSystem, path, this, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::openFileSystemOnMainThread(ScriptExecutionContext*, WebCommonWorkerClient* commonClient, WebFileSystem::Type type, long long size, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ if (!commonClient)
+ bridge->didFailOnMainThread(WebFileErrorAbort, mode);
+ else {
+ commonClient->openFileSystem(type, size, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+ }
+}
+
+void WorkerFileSystemCallbacksBridge::moveOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->move(sourcePath, destinationPath, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::copyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->copy(sourcePath, destinationPath, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::removeOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->remove(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::removeRecursivelyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->removeRecursively(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::readMetadataOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->readMetadata(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::createFileOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->createFile(path, exclusive, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::createDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->createDirectory(path, exclusive, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::fileExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->fileExists(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::directoryExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->directoryExists(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::readDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
+{
+ fileSystem->readDirectory(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
+}
+
+void WorkerFileSystemCallbacksBridge::didFailOnMainThread(WebFileError error, const String& mode)
+{
+ mayPostTaskToWorker(createCallbackTask(&didFailOnWorkerThread, this, error), mode);
+}
+
+void WorkerFileSystemCallbacksBridge::didOpenFileSystemOnMainThread(const String& name, const String& rootPath, const String& mode)
+{
+ mayPostTaskToWorker(createCallbackTask(&didOpenFileSystemOnWorkerThread, this, name, rootPath), mode);
+}
+
+void WorkerFileSystemCallbacksBridge::didSucceedOnMainThread(const String& mode)
+{
+ mayPostTaskToWorker(createCallbackTask(&didSucceedOnWorkerThread, this), mode);
+}
+
+void WorkerFileSystemCallbacksBridge::didReadMetadataOnMainThread(const WebFileInfo& info, const String& mode)
+{
+ mayPostTaskToWorker(createCallbackTask(&didReadMetadataOnWorkerThread, this, info), mode);
+}
+
+void WorkerFileSystemCallbacksBridge::didReadDirectoryOnMainThread(const WebVector<WebFileSystemEntry>& entries, bool hasMore, const String& mode)
+{
+ mayPostTaskToWorker(createCallbackTask(&didReadDirectoryOnWorkerThread, this, entries, hasMore), mode);
+}
+
+WorkerFileSystemCallbacksBridge::WorkerFileSystemCallbacksBridge(WebWorkerBase* worker, ScriptExecutionContext* scriptExecutionContext, WebFileSystemCallbacks* callbacks)
+ : WorkerContext::Observer(static_cast<WorkerContext*>(scriptExecutionContext))
+ , m_worker(worker)
+ , m_workerContext(scriptExecutionContext)
+ , m_callbacksOnWorkerThread(callbacks)
+{
+ ASSERT(m_workerContext->isContextThread());
+}
+
+WorkerFileSystemCallbacksBridge::~WorkerFileSystemCallbacksBridge()
+{
+ ASSERT(!m_callbacksOnWorkerThread);
+}
+
+void WorkerFileSystemCallbacksBridge::didFailOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, WebFileError error)
+{
+ bridge->m_callbacksOnWorkerThread->didFail(error);
+}
+
+void WorkerFileSystemCallbacksBridge::didOpenFileSystemOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const String& name, const String& rootPath)
+{
+ bridge->m_callbacksOnWorkerThread->didOpenFileSystem(name, rootPath);
+}
+
+void WorkerFileSystemCallbacksBridge::didSucceedOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge)
+{
+ bridge->m_callbacksOnWorkerThread->didSucceed();
+}
+
+void WorkerFileSystemCallbacksBridge::didReadMetadataOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const WebFileInfo& info)
+{
+ bridge->m_callbacksOnWorkerThread->didReadMetadata(info);
+}
+
+void WorkerFileSystemCallbacksBridge::didReadDirectoryOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const WebVector<WebFileSystemEntry>& entries, bool hasMore)
+{
+ bridge->m_callbacksOnWorkerThread->didReadDirectory(entries, hasMore);
+}
+
+bool WorkerFileSystemCallbacksBridge::derefIfWorkerIsStopped()
+{
+ WebWorkerBase* worker = 0;
+ {
+ MutexLocker locker(m_mutex);
+ worker = m_worker;
+ }
+
+ if (!worker) {
+ m_selfRef.clear();
+ return true;
+ }
+ return false;
+}
+
+void WorkerFileSystemCallbacksBridge::runTaskOnMainThread(WebCore::ScriptExecutionContext* scriptExecutionContext, WorkerFileSystemCallbacksBridge* bridge, PassOwnPtr<WebCore::ScriptExecutionContext::Task> taskToRun)
+{
+ ASSERT(isMainThread());
+ if (bridge->derefIfWorkerIsStopped())
+ return;
+ taskToRun->performTask(scriptExecutionContext);
+}
+
+void WorkerFileSystemCallbacksBridge::runTaskOnWorkerThread(WebCore::ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, PassOwnPtr<WebCore::ScriptExecutionContext::Task> taskToRun)
+{
+ if (!bridge->m_callbacksOnWorkerThread)
+ return;
+ ASSERT(bridge->m_workerContext->isContextThread());
+ taskToRun->performTask(scriptExecutionContext);
+ bridge->m_callbacksOnWorkerThread = 0;
+}
+
+void WorkerFileSystemCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task> task)
+{
+ ASSERT(!m_selfRef);
+ ASSERT(m_worker);
+ ASSERT(m_workerContext->isContextThread());
+ m_selfRef = this;
+ m_worker->dispatchTaskToMainThread(createCallbackTask(&runTaskOnMainThread, this, task));
+}
+
+void WorkerFileSystemCallbacksBridge::mayPostTaskToWorker(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode)
+{
+ ASSERT(isMainThread());
+ { // Let go of the mutex before possibly deleting this due to m_selfRef.clear().
+ MutexLocker locker(m_mutex);
+ if (m_worker)
+ m_worker->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, m_selfRef, task), mode);
+ }
+ m_selfRef.clear();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.h b/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.h
new file mode 100644
index 0000000..fa57f38
--- /dev/null
+++ b/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WorkerFileSystemCallbacksBridge_h
+#define WorkerFileSystemCallbacksBridge_h
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "PlatformString.h"
+#include "ScriptExecutionContext.h"
+#include "WebFileError.h"
+#include "WebFileSystem.h"
+#include "WebVector.h"
+#include "WorkerContext.h"
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/Threading.h>
+
+namespace WebKit {
+
+class AsyncFileSystem;
+class MainThreadFileSystemCallbacks;
+class ThreadableCallbacksBridgeWrapper;
+class WebCommonWorkerClient;
+class WebFileSystemCallbacks;
+class WebWorkerBase;
+struct WebFileInfo;
+struct WebFileSystemEntry;
+
+// This class is used to post a openFileSystem request to the main thread and get called back for the request. This must be destructed on the worker thread.
+//
+// A typical flow for openFileSystem would look like this:
+// Bridge::postOpenFileSystemToMainThread() on WorkerThread
+// --> Bridge::openFileSystemOnMainThread() is called on MainThread
+// This makes an IPC with a MainThreadFileSystemCallbacks instance
+// [actual operation is down in the browser]
+// --> MainThreadFileSystemCallbacks::didXxx is called on MainThread
+// --> Bridge::didXxxOnMainThread is called on MainThread
+// --> Bridge::didXxxOnWorkerThread is called on WorkerThread
+// This calls the original callbacks (m_callbacksOnWorkerThread) and
+// releases a self-reference to the bridge.
+class WorkerFileSystemCallbacksBridge : public ThreadSafeShared<WorkerFileSystemCallbacksBridge>, public WebCore::WorkerContext::Observer {
+public:
+ ~WorkerFileSystemCallbacksBridge();
+
+ // WorkerContext::Observer method.
+ virtual void notifyStop()
+ {
+ stop();
+ }
+
+ void stop();
+
+ static PassRefPtr<WorkerFileSystemCallbacksBridge> create(WebWorkerBase* worker, WebCore::ScriptExecutionContext* workerContext, WebFileSystemCallbacks* callbacks)
+ {
+ return adoptRef(new WorkerFileSystemCallbacksBridge(worker, workerContext, callbacks));
+ }
+
+ // Methods that create an instance and post an initial request task to the main thread. They must be called on the worker thread.
+ void postOpenFileSystemToMainThread(WebCommonWorkerClient*, WebFileSystem::Type, long long size, const String& mode);
+ void postMoveToMainThread(WebFileSystem*, const String& srcPath, const String& destPath, const String& mode);
+ void postCopyToMainThread(WebFileSystem*, const String& srcPath, const String& destPath, const String& mode);
+ void postRemoveToMainThread(WebFileSystem*, const String& path, const String& mode);
+ void postRemoveRecursivelyToMainThread(WebFileSystem*, const String& path, const String& mode);
+ void postReadMetadataToMainThread(WebFileSystem*, const String& path, const String& mode);
+ void postCreateFileToMainThread(WebFileSystem*, const String& path, bool exclusive, const String& mode);
+ void postCreateDirectoryToMainThread(WebFileSystem*, const String& path, bool exclusive, const String& mode);
+ void postFileExistsToMainThread(WebFileSystem*, const String& path, const String& mode);
+ void postDirectoryExistsToMainThread(WebFileSystem*, const String& path, const String& mode);
+ void postReadDirectoryToMainThread(WebFileSystem*, const String& path, const String& mode);
+
+ // Callback methods that are called on the main thread.
+ void didFailOnMainThread(WebFileError, const String& mode);
+ void didOpenFileSystemOnMainThread(const String& name, const String& rootPath, const String& mode);
+ void didSucceedOnMainThread(const String& mode);
+ void didReadMetadataOnMainThread(const WebFileInfo&, const String& mode);
+ void didReadDirectoryOnMainThread(const WebVector<WebFileSystemEntry>&, bool hasMore, const String& mode);
+
+private:
+ WorkerFileSystemCallbacksBridge(WebWorkerBase*, WebCore::ScriptExecutionContext*, WebFileSystemCallbacks*);
+
+ // Methods that are to be called on the main thread.
+ static void openFileSystemOnMainThread(WebCore::ScriptExecutionContext*, WebCommonWorkerClient*, WebFileSystem::Type, long long size, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void moveOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& srcPath, const String& destPath, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void copyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& srcPath, const String& destPath, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void removeOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void removeRecursivelyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void readMetadataOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void createFileOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void createDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void fileExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void directoryExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode);
+ static void readDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem*, const String& path, WorkerFileSystemCallbacksBridge*, const String& mode);
+
+ friend class MainThreadFileSystemCallbacks;
+
+ // Methods that dispatch WebFileSystemCallbacks on the worker threads.
+ // They release a selfRef of the WorkerFileSystemCallbacksBridge.
+ static void didFailOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, WebFileError);
+ static void didOpenFileSystemOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, const String& name, const String& rootPath);
+ static void didSucceedOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*);
+ static void didReadMetadataOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, const WebFileInfo&);
+ static void didReadDirectoryOnWorkerThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, const WebVector<WebFileSystemEntry>&, bool hasMore);
+
+ // For early-exist; this deref's selfRef and returns true if the worker is already null.
+ bool derefIfWorkerIsStopped();
+
+ static void runTaskOnMainThread(WebCore::ScriptExecutionContext*, WorkerFileSystemCallbacksBridge*, PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+ static void runTaskOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileSystemCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+
+ void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+ void mayPostTaskToWorker(PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const String& mode);
+
+ // m_selfRef keeps a reference to itself until a task is created for the worker thread (at which point the task holds the reference).
+ RefPtr<WorkerFileSystemCallbacksBridge> m_selfRef;
+
+ Mutex m_mutex;
+ WebWorkerBase* m_worker;
+ WebCore::ScriptExecutionContext* m_workerContext;
+
+ // This is self-destructed and must be fired on the worker thread.
+ WebFileSystemCallbacks* m_callbacksOnWorkerThread;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // WorkerFileSystemCallbacksBridge_h
diff --git a/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp
new file mode 100644
index 0000000..179aea5
--- /dev/null
+++ b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WorkerFileWriterCallbacksBridge.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileWriterClient.h"
+#include "CrossThreadTask.h"
+#include "WebCString.h"
+#include "WebFileSystem.h"
+#include "WebFileWriter.h"
+#include "WebKit.h"
+#include "WebKitClient.h"
+#include "WebWorkerBase.h"
+#include "WorkerContext.h"
+#include "WorkerLoaderProxy.h"
+#include "WorkerThread.h"
+#include <wtf/MainThread.h>
+#include <wtf/Threading.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WorkerFileWriterCallbacksBridge::notifyStop()
+{
+ ASSERT(m_workerContext->isContextThread());
+ m_clientOnWorkerThread = 0;
+}
+
+void WorkerFileWriterCallbacksBridge::postWriteToMainThread(long long position, const KURL& data)
+{
+ ASSERT(!m_operationInProgress);
+ m_operationInProgress = true;
+ dispatchTaskToMainThread(createCallbackTask(&writeOnMainThread, this, position, data));
+}
+
+void WorkerFileWriterCallbacksBridge::postTruncateToMainThread(long long length)
+{
+ ASSERT(!m_operationInProgress);
+ m_operationInProgress = true;
+ dispatchTaskToMainThread(createCallbackTask(&truncateOnMainThread, this, length));
+}
+
+void WorkerFileWriterCallbacksBridge::postAbortToMainThread()
+{
+ ASSERT(m_operationInProgress);
+ dispatchTaskToMainThread(createCallbackTask(&abortOnMainThread, this));
+}
+
+void WorkerFileWriterCallbacksBridge::postShutdownToMainThread(PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
+{
+ ASSERT(m_workerContext->isContextThread());
+ m_clientOnWorkerThread = 0;
+ dispatchTaskToMainThread(createCallbackTask(&shutdownOnMainThread, bridge));
+}
+
+void WorkerFileWriterCallbacksBridge::writeOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long position, const KURL& data)
+{
+ bridge->m_writer->write(position, WebURL(data));
+}
+
+void WorkerFileWriterCallbacksBridge::truncateOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length)
+{
+ bridge->m_writer->truncate(length);
+}
+
+void WorkerFileWriterCallbacksBridge::abortOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
+{
+ bridge->m_writer->cancel();
+}
+
+void WorkerFileWriterCallbacksBridge::initOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, const String& path)
+{
+ ASSERT(!bridge->m_writer);
+ bridge->m_writer = webKitClient()->fileSystem()->createFileWriter(path, bridge.get());
+}
+
+void WorkerFileWriterCallbacksBridge::shutdownOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
+{
+ bridge->m_writerDeleted = true;
+ bridge->m_writer.clear();
+}
+
+void WorkerFileWriterCallbacksBridge::didWrite(long long bytes, bool complete)
+{
+ dispatchTaskToWorkerThread(createCallbackTask(&didWriteOnWorkerThread, this, bytes, complete));
+}
+
+void WorkerFileWriterCallbacksBridge::didFail(WebFileError error)
+{
+ dispatchTaskToWorkerThread(createCallbackTask(&didFailOnWorkerThread, this, error));
+}
+
+void WorkerFileWriterCallbacksBridge::didTruncate()
+{
+ dispatchTaskToWorkerThread(createCallbackTask(&didTruncateOnWorkerThread, this));
+}
+
+static const char fileWriterOperationsMode[] = "fileWriterOperationsMode";
+
+WorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge(const String& path, WorkerLoaderProxy* proxy, ScriptExecutionContext* scriptExecutionContext, AsyncFileWriterClient* client)
+ : WorkerContext::Observer(static_cast<WorkerContext*>(scriptExecutionContext))
+ , m_proxy(proxy)
+ , m_workerContext(scriptExecutionContext)
+ , m_clientOnWorkerThread(client)
+ , m_writerDeleted(false)
+ , m_operationInProgress(false)
+{
+ ASSERT(m_workerContext->isContextThread());
+ m_mode = fileWriterOperationsMode;
+ m_mode.append(String::number(static_cast<WorkerContext*>(scriptExecutionContext)->thread()->runLoop().createUniqueId()));
+ postInitToMainThread(path);
+}
+
+void WorkerFileWriterCallbacksBridge::postInitToMainThread(const String& path)
+{
+ dispatchTaskToMainThread(createCallbackTask(&initOnMainThread, this, path));
+}
+
+WorkerFileWriterCallbacksBridge::~WorkerFileWriterCallbacksBridge()
+{
+ ASSERT(!m_clientOnWorkerThread);
+ ASSERT(!m_writer);
+}
+
+// We know m_clientOnWorkerThread is still valid because it is only cleared on the context thread, and because we check in runTaskOnWorkerThread before calling any of these methods.
+void WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length, bool complete)
+{
+ ASSERT(bridge->m_workerContext->isContextThread());
+ ASSERT(bridge->m_operationInProgress);
+ if (complete)
+ bridge->m_operationInProgress = false;
+ bridge->m_clientOnWorkerThread->didWrite(length, complete);
+}
+
+void WorkerFileWriterCallbacksBridge::didFailOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, WebFileError error)
+{
+ ASSERT(bridge->m_workerContext->isContextThread());
+ ASSERT(bridge->m_operationInProgress);
+ bridge->m_operationInProgress = false;
+ bridge->m_clientOnWorkerThread->didFail(static_cast<FileError::ErrorCode>(error));
+}
+
+void WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
+{
+ ASSERT(bridge->m_workerContext->isContextThread());
+ ASSERT(bridge->m_operationInProgress);
+ bridge->m_operationInProgress = false;
+ bridge->m_clientOnWorkerThread->didTruncate();
+}
+
+void WorkerFileWriterCallbacksBridge::runTaskOnMainThread(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, PassOwnPtr<ScriptExecutionContext::Task> taskToRun)
+{
+ ASSERT(isMainThread());
+ if (!bridge->m_writerDeleted)
+ taskToRun->performTask(scriptExecutionContext);
+}
+
+void WorkerFileWriterCallbacksBridge::runTaskOnWorkerThread(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, PassOwnPtr<ScriptExecutionContext::Task> taskToRun)
+{
+ ASSERT(bridge->m_workerContext->isContextThread());
+ if (bridge->m_clientOnWorkerThread)
+ taskToRun->performTask(scriptExecutionContext);
+}
+
+void WorkerFileWriterCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<ScriptExecutionContext::Task> task)
+{
+ ASSERT(m_workerContext->isContextThread());
+ WebWorkerBase::dispatchTaskToMainThread(createCallbackTask(&runTaskOnMainThread, this, task));
+}
+
+void WorkerFileWriterCallbacksBridge::dispatchTaskToWorkerThread(PassOwnPtr<ScriptExecutionContext::Task> task)
+{
+ ASSERT(isMainThread());
+ m_proxy->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, this, task), m_mode);
+}
+
+bool WorkerFileWriterCallbacksBridge::waitForOperationToComplete()
+{
+ while (m_operationInProgress) {
+ WorkerContext* context = static_cast<WorkerContext*>(m_workerContext);
+ if (context->thread()->runLoop().runInMode(context, m_mode) == MessageQueueTerminated)
+ return false;
+ }
+ return true;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h
new file mode 100644
index 0000000..62e333c
--- /dev/null
+++ b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#ifndef WorkerFileWriterCallbacksBridge_h
+#define WorkerFileWriterCallbacksBridge_h
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "WebFileError.h"
+#include "WebFileWriterClient.h"
+#include "WorkerContext.h"
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/ThreadSafeShared.h>
+
+namespace WebCore {
+ class AsyncFileWriterClient;
+ class KURL;
+ class WorkerLoaderProxy;
+}
+
+namespace WTF {
+ class String;
+}
+using WTF::String;
+
+namespace WebKit {
+
+class WebFileSystem;
+class WebFileWriter;
+class WebFileWriterClient;
+class WebWorkerBase;
+
+// This class is used as a mechanism to bridge calls between threads.
+// Calls to a WebFileWriter must happen on the main thread, but they come from
+// the context thread. The responses through the WebFileWriterClient interface
+// start on the main thread, but must be sent via the worker context thread.
+//
+// A typical flow for write would look like this:
+// Bridge::postWriteToMainThread() on WorkerThread
+// --> Bridge::writeOnMainThread() is called on MainThread
+// --> WebFileWriter::write()
+// This makes an IPC; the actual operation is down in the browser.
+// --> Bridge::didWrite is called on MainThread
+// --> Bridge::didWriteOnWorkerThread is called on WorkerThread
+// This calls the original client (m_clientOnWorkerThread).
+//
+// The bridge object is refcounted, so that it doesn't get deleted while there
+// are cross-thread calls in flight. Each CrossThreadTask carries a reference
+// to the bridge, which guarantees that the bridge will still be valid when the
+// task is executed. In order to shut down the bridge, the WebFileWriterClient
+// should call postShutdownToMainThread before dropping its reference to the
+// bridge. This ensures that the WebFileWriter will be cleared on the main
+// thread and that no further calls to the WebFileWriterClient will be made.
+class WorkerFileWriterCallbacksBridge : public ThreadSafeShared<WorkerFileWriterCallbacksBridge>, public WebCore::WorkerContext::Observer, public WebFileWriterClient {
+public:
+ ~WorkerFileWriterCallbacksBridge();
+
+ // WorkerContext::Observer method.
+ virtual void notifyStop();
+
+ static PassRefPtr<WorkerFileWriterCallbacksBridge> create(const String& path, WebCore::WorkerLoaderProxy* proxy, WebCore::ScriptExecutionContext* workerContext, WebCore::AsyncFileWriterClient* client)
+ {
+ return adoptRef(new WorkerFileWriterCallbacksBridge(path, proxy, workerContext, client));
+ }
+
+ // Methods that create an instance and post an initial request task to the main thread. They must be called on the worker thread.
+ void postWriteToMainThread(long long position, const WebCore::KURL& data);
+ void postTruncateToMainThread(long long length);
+ void postAbortToMainThread();
+
+ // The owning WorkerAsyncFileWriterChromium should call this method before dropping its last reference to the bridge, on the context thread.
+ // The actual deletion of the WorkerFileWriterCallbacksBridge may happen on either the main or context thread, depending on where the last reference goes away; that's safe as long as this is called first.
+ void postShutdownToMainThread(PassRefPtr<WorkerFileWriterCallbacksBridge>);
+
+ // Callback methods that are called on the main thread.
+ // These are the implementation of WebKit::WebFileWriterClient.
+ void didWrite(long long bytes, bool complete);
+ void didFail(WebFileError);
+ void didTruncate();
+
+ // Call this on the context thread to wait for the current operation to complete.
+ bool waitForOperationToComplete();
+
+private:
+ WorkerFileWriterCallbacksBridge(const String& path, WebCore::WorkerLoaderProxy*, WebCore::ScriptExecutionContext*, WebCore::AsyncFileWriterClient*);
+
+ void postInitToMainThread(const String& path);
+
+ // Methods that are to be called on the main thread.
+ static void writeOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long position, const WebCore::KURL& data);
+ static void truncateOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long length);
+ static void abortOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>);
+ static void initOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, const String& path);
+ static void shutdownOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>);
+
+ // Methods that dispatch to AsyncFileWriterClient on the worker threads.
+ static void didWriteOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long length, bool complete);
+ static void didFailOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, WebFileError);
+ static void didTruncateOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>);
+
+ // Called on the main thread to run the supplied task.
+ static void runTaskOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+ // Called on the worker thread to run the supplied task.
+ static void runTaskOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+
+ // Called on the worker thread to dispatch to the main thread.
+ void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+ // Called on the main thread to dispatch to the worker thread.
+ void dispatchTaskToWorkerThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+
+ // Used from the main thread to post tasks to the context thread.
+ WebCore::WorkerLoaderProxy* m_proxy;
+
+ // Used on the context thread, only to check that we're running on the context thread.
+ WebCore::ScriptExecutionContext* m_workerContext;
+
+ // Created and destroyed from the main thread.
+ OwnPtr<WebKit::WebFileWriter> m_writer;
+
+ // Used on the context thread to call back into the client.
+ WebCore::AsyncFileWriterClient* m_clientOnWorkerThread;
+
+ // Used to indicate that shutdown has started on the main thread, and hence the writer has been deleted.
+ bool m_writerDeleted;
+
+ // Used by waitForOperationToComplete.
+ bool m_operationInProgress;
+
+ // Used by postTaskForModeToWorkerContext and runInMode.
+ String m_mode;
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // WorkerFileWriterCallbacksBridge_h
diff --git a/WebKit/chromium/src/WrappedResourceRequest.h b/WebKit/chromium/src/WrappedResourceRequest.h
index 97311db..3057387 100644
--- a/WebKit/chromium/src/WrappedResourceRequest.h
+++ b/WebKit/chromium/src/WrappedResourceRequest.h
@@ -31,9 +31,7 @@
#ifndef WrappedResourceRequest_h
#define WrappedResourceRequest_h
-// FIXME: This relative path is a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebURLRequest.h"
+#include "WebURLRequest.h"
#include "WebURLRequestPrivate.h"
namespace WebKit {
diff --git a/WebKit/chromium/src/WrappedResourceResponse.h b/WebKit/chromium/src/WrappedResourceResponse.h
index af4f88f..927582d 100644
--- a/WebKit/chromium/src/WrappedResourceResponse.h
+++ b/WebKit/chromium/src/WrappedResourceResponse.h
@@ -31,9 +31,7 @@
#ifndef WrappedResourceResponse_h
#define WrappedResourceResponse_h
-// FIXME: This relative path is a temporary hack to support using this
-// header from webkit/glue.
-#include "../public/WebURLResponse.h"
+#include "WebURLResponse.h"
#include "WebURLResponsePrivate.h"
namespace WebKit {
diff --git a/WebKit/chromium/src/gtk/WebFontInfo.cpp b/WebKit/chromium/src/gtk/WebFontInfo.cpp
index 76ed618..dd25eb1 100644
--- a/WebKit/chromium/src/gtk/WebFontInfo.cpp
+++ b/WebKit/chromium/src/gtk/WebFontInfo.cpp
@@ -30,6 +30,7 @@
#include "config.h"
#include "WebFontInfo.h"
+#include "WebFontRenderStyle.h"
#include <fontconfig/fontconfig.h>
#include <string.h>
@@ -55,11 +56,11 @@ WebCString WebFontInfo::familyForChars(const WebUChar* characters, size_t numCha
FcValue fcvalue;
fcvalue.type = FcTypeCharSet;
fcvalue.u.c = cset;
- FcPatternAdd(pattern, FC_CHARSET, fcvalue, 0);
+ FcPatternAdd(pattern, FC_CHARSET, fcvalue, FcFalse);
fcvalue.type = FcTypeBool;
fcvalue.u.b = FcTrue;
- FcPatternAdd(pattern, FC_SCALABLE, fcvalue, 0);
+ FcPatternAdd(pattern, FC_SCALABLE, fcvalue, FcFalse);
FcConfigSubstitute(0, pattern, FcMatchPattern);
FcDefaultSubstitute(pattern);
@@ -104,4 +105,85 @@ WebCString WebFontInfo::familyForChars(const WebUChar* characters, size_t numCha
return WebCString();
}
+void WebFontInfo::renderStyleForStrike(const char* family, int sizeAndStyle, WebFontRenderStyle* out)
+{
+ bool isBold = sizeAndStyle & 1;
+ bool isItalic = sizeAndStyle & 2;
+ int pixelSize = sizeAndStyle >> 2;
+
+ FcPattern* pattern = FcPatternCreate();
+ FcValue fcvalue;
+
+ fcvalue.type = FcTypeString;
+ fcvalue.u.s = reinterpret_cast<const FcChar8 *>(family);
+ FcPatternAdd(pattern, FC_FAMILY, fcvalue, FcFalse);
+
+ fcvalue.type = FcTypeInteger;
+ fcvalue.u.i = isBold ? FC_WEIGHT_BOLD : FC_WEIGHT_NORMAL;
+ FcPatternAdd(pattern, FC_WEIGHT, fcvalue, FcFalse);
+
+ fcvalue.type = FcTypeInteger;
+ fcvalue.u.i = isItalic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN;
+ FcPatternAdd(pattern, FC_SLANT, fcvalue, FcFalse);
+
+ fcvalue.type = FcTypeBool;
+ fcvalue.u.b = FcTrue;
+ FcPatternAdd(pattern, FC_SCALABLE, fcvalue, FcFalse);
+
+ fcvalue.type = FcTypeDouble;
+ fcvalue.u.d = pixelSize;
+ FcPatternAdd(pattern, FC_SIZE, fcvalue, FcFalse);
+
+ FcConfigSubstitute(0, pattern, FcMatchPattern);
+ FcDefaultSubstitute(pattern);
+
+ FcResult result;
+ // Some versions of fontconfig don't actually write a value into result.
+ // However, it's not clear from the documentation if result should be a
+ // non-0 pointer: future versions might expect to be able to write to
+ // it. So we pass in a valid pointer and ignore it.
+ FcPattern* match = FcFontMatch(0, pattern, &result);
+ FcPatternDestroy(pattern);
+
+ out->setDefaults();
+
+ if (!match) {
+ FcPatternDestroy(match);
+ return;
+ }
+
+ FcBool b;
+ int i;
+
+ if (FcPatternGetBool(match, FC_ANTIALIAS, 0, &b) == FcResultMatch)
+ out->useAntiAlias = b;
+ if (FcPatternGetBool(match, FC_EMBEDDED_BITMAP, 0, &b) == FcResultMatch)
+ out->useBitmaps = b;
+ if (FcPatternGetBool(match, FC_AUTOHINT, 0, &b) == FcResultMatch)
+ out->useAutoHint = b;
+ if (FcPatternGetBool(match, FC_HINTING, 0, &b) == FcResultMatch)
+ out->useHinting = b;
+ if (FcPatternGetInteger(match, FC_HINT_STYLE, 0, &i) == FcResultMatch)
+ out->hintStyle = i;
+ if (FcPatternGetInteger(match, FC_RGBA, 0, &i) == FcResultMatch) {
+ switch (i) {
+ case FC_RGBA_NONE:
+ out->useSubpixel = 0;
+ break;
+ case FC_RGBA_RGB:
+ case FC_RGBA_BGR:
+ case FC_RGBA_VRGB:
+ case FC_RGBA_VBGR:
+ out->useSubpixel = 1;
+ break;
+ default:
+ // This includes FC_RGBA_UNKNOWN.
+ out->useSubpixel = 2;
+ break;
+ }
+ }
+
+ FcPatternDestroy(match);
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/gtk/WebInputEventFactory.cpp b/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
index 7125a16..71d1b39 100644
--- a/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
+++ b/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
@@ -45,12 +45,15 @@
namespace {
-gint getDoubleClickTime()
+bool countsAsDoubleClick(gint timeDiff, gint xDiff, gint yDiff)
{
static GtkSettings* settings = gtk_settings_get_default();
gint doubleClickTime = 250;
- g_object_get(G_OBJECT(settings), "gtk-double-click-time", &doubleClickTime, 0);
- return doubleClickTime;
+ gint doubleClickDistance = 5;
+ g_object_get(G_OBJECT(settings),
+ "gtk-double-click-time", &doubleClickTime,
+ "gtk-double-click-distance", &doubleClickDistance, NULL);
+ return timeDiff <= doubleClickTime && abs(xDiff) <= doubleClickDistance && abs(yDiff) <= doubleClickDistance;
}
} // namespace
@@ -82,6 +85,10 @@ static int gdkStateToWebEventModifiers(guint state)
modifiers |= WebInputEvent::MiddleButtonDown;
if (state & GDK_BUTTON3_MASK)
modifiers |= WebInputEvent::RightButtonDown;
+ if (state & GDK_LOCK_MASK)
+ modifiers |= WebInputEvent::CapsLockOn;
+ if (state & GDK_MOD2_MASK)
+ modifiers |= WebInputEvent::NumLockOn;
return modifiers;
}
@@ -151,6 +158,60 @@ static int gdkEventToWindowsKeyCode(const GdkEventKey* event)
GDK_period, // 0x3C: GDK_period
GDK_slash, // 0x3D: GDK_slash
0, // 0x3E: GDK_Shift_R
+ 0, // 0x3F:
+ 0, // 0x40:
+ 0, // 0x41:
+ 0, // 0x42:
+ 0, // 0x43:
+ 0, // 0x44:
+ 0, // 0x45:
+ 0, // 0x46:
+ 0, // 0x47:
+ 0, // 0x48:
+ 0, // 0x49:
+ 0, // 0x4A:
+ 0, // 0x4B:
+ 0, // 0x4C:
+ 0, // 0x4D:
+ 0, // 0x4E:
+ 0, // 0x4F:
+ 0, // 0x50:
+ 0, // 0x51:
+ 0, // 0x52:
+ 0, // 0x53:
+ 0, // 0x54:
+ 0, // 0x55:
+ 0, // 0x56:
+ 0, // 0x57:
+ 0, // 0x58:
+ 0, // 0x59:
+ 0, // 0x5A:
+ 0, // 0x5B:
+ 0, // 0x5C:
+ 0, // 0x5D:
+ 0, // 0x5E:
+ 0, // 0x5F:
+ 0, // 0x60:
+ 0, // 0x61:
+ 0, // 0x62:
+ 0, // 0x63:
+ 0, // 0x64:
+ 0, // 0x65:
+ 0, // 0x66:
+ 0, // 0x67:
+ 0, // 0x68:
+ 0, // 0x69:
+ 0, // 0x6A:
+ 0, // 0x6B:
+ 0, // 0x6C:
+ 0, // 0x6D:
+ 0, // 0x6E:
+ 0, // 0x6F:
+ 0, // 0x70:
+ 0, // 0x71:
+ 0, // 0x72:
+ GDK_Super_L, // 0x73: GDK_Super_L
+ GDK_Super_R, // 0x74: GDK_Super_R
};
// |windowsKeyCode| has to include a valid virtual-key code even when we
@@ -350,9 +411,13 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event)
static int numClicks = 0;
static GdkWindow* eventWindow = 0;
static gint lastLeftClickTime = 0;
+ static gint lastLeftClickX = 0;
+ static gint lastLeftClickY = 0;
- gint time_diff = event->time - lastLeftClickTime;
- if (eventWindow == event->window && time_diff < getDoubleClickTime())
+ gint timeDiff = event->time - lastLeftClickTime;
+ gint xDiff = event->x - lastLeftClickX;
+ gint yDiff = event->y - lastLeftClickY;
+ if (eventWindow == event->window && countsAsDoubleClick(timeDiff, xDiff, yDiff))
numClicks++;
else
numClicks = 1;
@@ -360,6 +425,8 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event)
result.clickCount = numClicks;
eventWindow = event->window;
lastLeftClickTime = event->time;
+ lastLeftClickX = event->x;
+ lastLeftClickY = event->y;
}
result.button = WebMouseEvent::ButtonNone;
diff --git a/WebKit/chromium/src/gtk/WebScreenInfoFactory.cpp b/WebKit/chromium/src/gtk/WebScreenInfoFactory.cpp
deleted file mode 100644
index 081daa2..0000000
--- a/WebKit/chromium/src/gtk/WebScreenInfoFactory.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2009 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-#include "config.h"
-#include "WebScreenInfoFactory.h"
-
-#include "WebScreenInfo.h"
-#include <gtk/gtk.h>
-
-namespace WebKit {
-
-WebScreenInfo WebScreenInfoFactory::screenInfo(GtkWidget* widget)
-{
- WebScreenInfo results;
- results.depth = 32;
- results.depthPerComponent = 8;
- results.isMonochrome = false;
-
- if (!widget)
- return results;
-
- GdkScreen* screen = gtk_widget_get_screen(widget);
-
- results.rect = WebRect(
- 0, 0, gdk_screen_get_width(screen), gdk_screen_get_height(screen));
-
- // I don't know of a way to query the "maximize" size of the window (e.g.
- // screen size less sidebars etc) since this is something which only the
- // window manager knows.
- results.availableRect = results.rect;
-
- return results;
-}
-
-} // namespace WebKit
diff --git a/WebKit/chromium/src/js/DebuggerAgent.js b/WebKit/chromium/src/js/DebuggerAgent.js
deleted file mode 100644
index 301620a..0000000
--- a/WebKit/chromium/src/js/DebuggerAgent.js
+++ /dev/null
@@ -1,1528 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-/**
- * @fileoverview Provides communication interface to remote v8 debugger. See
- * protocol decription at http://code.google.com/p/v8/wiki/DebuggerProtocol
- */
-
-/**
- * FIXME: change field naming style to use trailing underscore.
- * @constructor
- */
-devtools.DebuggerAgent = function()
-{
- RemoteDebuggerAgent.debuggerOutput = this.handleDebuggerOutput_.bind(this);
- RemoteDebuggerAgent.setContextId = this.setContextId_.bind(this);
-
- /**
- * Id of the inspected page global context. It is used for filtering scripts.
- * @type {number}
- */
- this.contextId_ = null;
-
- /**
- * Mapping from script id to script info.
- * @type {Object}
- */
- this.parsedScripts_ = null;
-
- /**
- * Mapping from the request id to the devtools.BreakpointInfo for the
- * breakpoints whose v8 ids are not set yet. These breakpoints are waiting for
- * "setbreakpoint" responses to learn their ids in the v8 debugger.
- * @see #handleSetBreakpointResponse_
- * @type {Object}
- */
- this.requestNumberToBreakpointInfo_ = null;
-
- /**
- * Information on current stack frames.
- * @type {Array.<devtools.CallFrame>}
- */
- this.callFrames_ = [];
-
- /**
- * Whether to stop in the debugger on the exceptions.
- * @type {boolean}
- */
- this.pauseOnExceptions_ = false;
-
- /**
- * Mapping: request sequence number->callback.
- * @type {Object}
- */
- this.requestSeqToCallback_ = null;
-
- /**
- * Whether the scripts panel has been shown and initialilzed.
- * @type {boolean}
- */
- this.scriptsPanelInitialized_ = false;
-
- /**
- * Whether the scripts list should be requested next time when context id is
- * set.
- * @type {boolean}
- */
- this.requestScriptsWhenContextIdSet_ = false;
-
- /**
- * Whether the agent is waiting for initial scripts response.
- * @type {boolean}
- */
- this.waitingForInitialScriptsResponse_ = false;
-
- /**
- * If backtrace response is received when initial scripts response
- * is not yet processed the backtrace handling will be postponed until
- * after the scripts response processing. The handler bound to its arguments
- * and this agent will be stored in this field then.
- * @type {?function()}
- */
- this.pendingBacktraceResponseHandler_ = null;
-
- /**
- * Container of all breakpoints set using resource URL. These breakpoints
- * survive page reload. Breakpoints set by script id(for scripts that don't
- * have URLs) are stored in ScriptInfo objects.
- * @type {Object}
- */
- this.urlToBreakpoints_ = {};
-
-
- /**
- * Exception message that is shown to user while on exception break.
- * @type {WebInspector.ConsoleMessage}
- */
- this.currentExceptionMessage_ = null;
-};
-
-
-/**
- * A copy of the scope types from v8/src/mirror-delay.js
- * @enum {number}
- */
-devtools.DebuggerAgent.ScopeType = {
- Global: 0,
- Local: 1,
- With: 2,
- Closure: 3,
- Catch: 4
-};
-
-
-/**
- * Resets debugger agent to its initial state.
- */
-devtools.DebuggerAgent.prototype.reset = function()
-{
- this.contextId_ = null;
- // No need to request scripts since they all will be pushed in AfterCompile
- // events.
- this.requestScriptsWhenContextIdSet_ = false;
- this.waitingForInitialScriptsResponse_ = false;
-
- this.parsedScripts_ = {};
- this.requestNumberToBreakpointInfo_ = {};
- this.callFrames_ = [];
- this.requestSeqToCallback_ = {};
-};
-
-
-/**
- * Initializes scripts UI. This method is called every time Scripts panel
- * is shown. It will send request for context id if it's not set yet.
- */
-devtools.DebuggerAgent.prototype.initUI = function()
-{
- // Initialize scripts cache when Scripts panel is shown first time.
- if (this.scriptsPanelInitialized_)
- return;
- this.scriptsPanelInitialized_ = true;
- if (this.contextId_) {
- // We already have context id. This means that we are here from the
- // very beginning of the page load cycle and hence will get all scripts
- // via after-compile events. No need to request scripts for this session.
- //
- // There can be a number of scripts from after-compile events that are
- // pending addition into the UI.
- for (var scriptId in this.parsedScripts_) {
- var script = this.parsedScripts_[scriptId];
- WebInspector.parsedScriptSource(scriptId, script.getUrl(), undefined /* script source */, script.getLineOffset());
- }
- return;
- }
- this.waitingForInitialScriptsResponse_ = true;
- // Script list should be requested only when current context id is known.
- RemoteDebuggerAgent.getContextId();
- this.requestScriptsWhenContextIdSet_ = true;
-};
-
-
-/**
- * Asynchronously requests the debugger for the script source.
- * @param {number} scriptId Id of the script whose source should be resolved.
- * @param {function(source:?string):void} callback Function that will be called
- * when the source resolution is completed. "source" parameter will be null
- * if the resolution fails.
- */
-devtools.DebuggerAgent.prototype.resolveScriptSource = function(scriptId, callback)
-{
- var script = this.parsedScripts_[scriptId];
- if (!script || script.isUnresolved()) {
- callback(null);
- return;
- }
-
- var cmd = new devtools.DebugCommand("scripts", {
- "ids": [scriptId],
- "includeSource": true
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
- // Force v8 execution so that it gets to processing the requested command.
- RemoteDebuggerAgent.processDebugCommands();
-
- this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
- if (msg.isSuccess()) {
- var scriptJson = msg.getBody()[0];
- if (scriptJson)
- callback(scriptJson.source);
- else
- callback(null);
- } else
- callback(null);
- };
-};
-
-
-/**
- * Tells the v8 debugger to stop on as soon as possible.
- */
-devtools.DebuggerAgent.prototype.pauseExecution = function()
-{
- RemoteDebuggerCommandExecutor.DebuggerPauseScript();
-};
-
-
-/**
- * @param {number} sourceId Id of the script fot the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- * @param {?string} condition The breakpoint condition.
- */
-devtools.DebuggerAgent.prototype.addBreakpoint = function(sourceId, line, condition)
-{
- var script = this.parsedScripts_[sourceId];
- if (!script)
- return;
-
- line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
- var commandArguments;
- if (script.getUrl()) {
- var breakpoints = this.urlToBreakpoints_[script.getUrl()];
- if (breakpoints && breakpoints[line])
- return;
- if (!breakpoints) {
- breakpoints = {};
- this.urlToBreakpoints_[script.getUrl()] = breakpoints;
- }
-
- var breakpointInfo = new devtools.BreakpointInfo(line);
- breakpoints[line] = breakpointInfo;
-
- commandArguments = {
- "groupId": this.contextId_,
- "type": "script",
- "target": script.getUrl(),
- "line": line,
- "condition": condition
- };
- } else {
- var breakpointInfo = script.getBreakpointInfo(line);
- if (breakpointInfo)
- return;
-
- breakpointInfo = new devtools.BreakpointInfo(line);
- script.addBreakpointInfo(breakpointInfo);
-
- commandArguments = {
- "groupId": this.contextId_,
- "type": "scriptId",
- "target": sourceId,
- "line": line,
- "condition": condition
- };
- }
-
- var cmd = new devtools.DebugCommand("setbreakpoint", commandArguments);
-
- this.requestNumberToBreakpointInfo_[cmd.getSequenceNumber()] = breakpointInfo;
-
- devtools.DebuggerAgent.sendCommand_(cmd);
- // Force v8 execution so that it gets to processing the requested command.
- // It is necessary for being able to change a breakpoint just after it
- // has been created (since we need an existing breakpoint id for that).
- RemoteDebuggerAgent.processDebugCommands();
-};
-
-
-/**
- * @param {number} sourceId Id of the script for the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- */
-devtools.DebuggerAgent.prototype.removeBreakpoint = function(sourceId, line)
-{
- var script = this.parsedScripts_[sourceId];
- if (!script)
- return;
-
- line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
- var breakpointInfo;
- if (script.getUrl()) {
- var breakpoints = this.urlToBreakpoints_[script.getUrl()];
- breakpointInfo = breakpoints[line];
- delete breakpoints[line];
- } else {
- breakpointInfo = script.getBreakpointInfo(line);
- if (breakpointInfo)
- script.removeBreakpointInfo(breakpointInfo);
- }
-
- if (!breakpointInfo)
- return;
-
- breakpointInfo.markAsRemoved();
-
- var id = breakpointInfo.getV8Id();
-
- // If we don't know id of this breakpoint in the v8 debugger we cannot send
- // "clearbreakpoint" request. In that case it will be removed in
- // "setbreakpoint" response handler when we learn the id.
- if (id !== -1) {
- this.requestClearBreakpoint_(id);
- }
-};
-
-
-/**
- * @param {number} sourceId Id of the script for the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- * @param {?string} condition New breakpoint condition.
- */
-devtools.DebuggerAgent.prototype.updateBreakpoint = function(sourceId, line, condition)
-{
- var script = this.parsedScripts_[sourceId];
- if (!script)
- return;
-
- line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
- var breakpointInfo;
- if (script.getUrl()) {
- var breakpoints = this.urlToBreakpoints_[script.getUrl()];
- breakpointInfo = breakpoints[line];
- } else
- breakpointInfo = script.getBreakpointInfo(line);
-
- var id = breakpointInfo.getV8Id();
-
- // If we don't know id of this breakpoint in the v8 debugger we cannot send
- // the "changebreakpoint" request.
- if (id !== -1) {
- // TODO(apavlov): make use of the real values for "enabled" and
- // "ignoreCount" when appropriate.
- this.requestChangeBreakpoint_(id, true, condition, null);
- }
-};
-
-
-/**
- * Tells the v8 debugger to step into the next statement.
- */
-devtools.DebuggerAgent.prototype.stepIntoStatement = function()
-{
- this.stepCommand_("in");
-};
-
-
-/**
- * Tells the v8 debugger to step out of current function.
- */
-devtools.DebuggerAgent.prototype.stepOutOfFunction = function()
-{
- this.stepCommand_("out");
-};
-
-
-/**
- * Tells the v8 debugger to step over the next statement.
- */
-devtools.DebuggerAgent.prototype.stepOverStatement = function()
-{
- this.stepCommand_("next");
-};
-
-
-/**
- * Tells the v8 debugger to continue execution after it has been stopped on a
- * breakpoint or an exception.
- */
-devtools.DebuggerAgent.prototype.resumeExecution = function()
-{
- this.clearExceptionMessage_();
- var cmd = new devtools.DebugCommand("continue");
- devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Creates exception message and schedules it for addition to the resource upon
- * backtrace availability.
- * @param {string} url Resource url.
- * @param {number} line Resource line number.
- * @param {string} message Exception text.
- */
-devtools.DebuggerAgent.prototype.createExceptionMessage_ = function(url, line, message)
-{
- this.currentExceptionMessage_ = new WebInspector.ConsoleMessage(
- WebInspector.ConsoleMessage.MessageSource.JS,
- WebInspector.ConsoleMessage.MessageType.Log,
- WebInspector.ConsoleMessage.MessageLevel.Error,
- line,
- url,
- 0 /* group level */,
- 1 /* repeat count */,
- "[Exception] " + message);
-};
-
-
-/**
- * Shows pending exception message that is created with createExceptionMessage_
- * earlier.
- */
-devtools.DebuggerAgent.prototype.showPendingExceptionMessage_ = function()
-{
- if (!this.currentExceptionMessage_)
- return;
- var msg = this.currentExceptionMessage_;
- var resource = WebInspector.resourceURLMap[msg.url];
- if (resource) {
- msg.resource = resource;
- WebInspector.panels.resources.addMessageToResource(resource, msg);
- } else
- this.currentExceptionMessage_ = null;
-};
-
-
-/**
- * Clears exception message from the resource.
- */
-devtools.DebuggerAgent.prototype.clearExceptionMessage_ = function()
-{
- if (this.currentExceptionMessage_) {
- var messageElement = this.currentExceptionMessage_._resourceMessageLineElement;
- var bubble = messageElement.parentElement;
- bubble.removeChild(messageElement);
- if (!bubble.firstChild) {
- // Last message in bubble removed.
- bubble.parentElement.removeChild(bubble);
- }
- this.currentExceptionMessage_ = null;
- }
-};
-
-
-/**
- * @return {boolean} True iff the debugger will pause execution on the
- * exceptions.
- */
-devtools.DebuggerAgent.prototype.pauseOnExceptions = function()
-{
- return this.pauseOnExceptions_;
-};
-
-
-/**
- * Tells whether to pause in the debugger on the exceptions or not.
- * @param {boolean} value True iff execution should be stopped in the debugger
- * on the exceptions.
- */
-devtools.DebuggerAgent.prototype.setPauseOnExceptions = function(value)
-{
- this.pauseOnExceptions_ = value;
-};
-
-
-/**
- * Sends "evaluate" request to the debugger.
- * @param {Object} arguments Request arguments map.
- * @param {function(devtools.DebuggerMessage)} callback Callback to be called
- * when response is received.
- */
-devtools.DebuggerAgent.prototype.requestEvaluate = function(arguments, callback)
-{
- var cmd = new devtools.DebugCommand("evaluate", arguments);
- devtools.DebuggerAgent.sendCommand_(cmd);
- this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
-};
-
-
-/**
- * Sends "lookup" request for each unresolved property of the object. When
- * response is received the properties will be changed with their resolved
- * values.
- * @param {Object} object Object whose properties should be resolved.
- * @param {function(devtools.DebuggerMessage)} Callback to be called when all
- * children are resolved.
- * @param {boolean} noIntrinsic Whether intrinsic properties should be included.
- */
-devtools.DebuggerAgent.prototype.resolveChildren = function(object, callback, noIntrinsic)
-{
- if ("handle" in object) {
- var result = [];
- devtools.DebuggerAgent.formatObjectProperties_(object, result, noIntrinsic);
- callback(result);
- } else {
- this.requestLookup_([object.ref], function(msg) {
- var result = [];
- if (msg.isSuccess()) {
- var handleToObject = msg.getBody();
- var resolved = handleToObject[object.ref];
- devtools.DebuggerAgent.formatObjectProperties_(resolved, result, noIntrinsic);
- callback(result);
- } else
- callback([]);
- });
- }
-};
-
-
-/**
- * Sends "scope" request for the scope object to resolve its variables.
- * @param {Object} scope Scope to be resolved.
- * @param {function(Array.<WebInspector.ObjectPropertyProxy>)} callback
- * Callback to be called when all scope variables are resolved.
- */
-devtools.DebuggerAgent.prototype.resolveScope = function(scope, callback)
-{
- var cmd = new devtools.DebugCommand("scope", {
- "frameNumber": scope.frameNumber,
- "number": scope.index,
- "compactFormat": true
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
- this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
- var result = [];
- if (msg.isSuccess()) {
- var scopeObjectJson = msg.getBody().object;
- devtools.DebuggerAgent.formatObjectProperties_(scopeObjectJson, result, true /* no intrinsic */);
- }
- callback(result);
- };
-};
-
-
-/**
- * Sends "scopes" request for the frame object to resolve all variables
- * available in the frame.
- * @param {number} callFrameId Id of call frame whose variables need to
- * be resolved.
- * @param {function(Object)} callback Callback to be called when all frame
- * variables are resolved.
- */
-devtools.DebuggerAgent.prototype.resolveFrameVariables_ = function(callFrameId, callback)
-{
- var result = {};
-
- var frame = this.callFrames_[callFrameId];
- if (!frame) {
- callback(result);
- return;
- }
-
- var waitingResponses = 0;
- function scopeResponseHandler(msg) {
- waitingResponses--;
-
- if (msg.isSuccess()) {
- var properties = msg.getBody().object.properties;
- for (var j = 0; j < properties.length; j++)
- result[properties[j].name] = true;
- }
-
- // When all scopes are resolved invoke the callback.
- if (waitingResponses === 0)
- callback(result);
- };
-
- for (var i = 0; i < frame.scopeChain.length; i++) {
- var scope = frame.scopeChain[i].objectId;
- if (scope.type === devtools.DebuggerAgent.ScopeType.Global) {
- // Do not resolve global scope since it takes for too long.
- // TODO(yurys): allow to send only property names in the response.
- continue;
- }
- var cmd = new devtools.DebugCommand("scope", {
- "frameNumber": scope.frameNumber,
- "number": scope.index,
- "compactFormat": true
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
- this.requestSeqToCallback_[cmd.getSequenceNumber()] = scopeResponseHandler;
- waitingResponses++;
- }
-};
-
-/**
- * Evaluates the expressionString to an object in the call frame and reports
- * all its properties.
- * @param{string} expressionString Expression whose properties should be
- * collected.
- * @param{number} callFrameId The frame id.
- * @param{function(Object result,bool isException)} reportCompletions Callback
- * function.
- */
-devtools.DebuggerAgent.prototype.resolveCompletionsOnFrame = function(expressionString, callFrameId, reportCompletions)
-{
- if (expressionString) {
- expressionString = "var obj = " + expressionString +
- "; var names = {}; for (var n in obj) { names[n] = true; };" +
- "names;";
- this.evaluateInCallFrame(
- callFrameId,
- expressionString,
- function(result) {
- var names = {};
- if (!result.isException) {
- var props = result.value.objectId.properties;
- // Put all object properties into the map.
- for (var i = 0; i < props.length; i++)
- names[props[i].name] = true;
- }
- reportCompletions(names, result.isException);
- });
- } else {
- this.resolveFrameVariables_(callFrameId,
- function(result) {
- reportCompletions(result, false /* isException */);
- });
- }
-};
-
-
-/**
- * @param{number} scriptId
- * @return {string} Type of the context of the script with specified id.
- */
-devtools.DebuggerAgent.prototype.getScriptContextType = function(scriptId)
-{
- return this.parsedScripts_[scriptId].getContextType();
-};
-
-
-/**
- * Removes specified breakpoint from the v8 debugger.
- * @param {number} breakpointId Id of the breakpoint in the v8 debugger.
- */
-devtools.DebuggerAgent.prototype.requestClearBreakpoint_ = function(breakpointId)
-{
- var cmd = new devtools.DebugCommand("clearbreakpoint", {
- "breakpoint": breakpointId
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Changes breakpoint parameters in the v8 debugger.
- * @param {number} breakpointId Id of the breakpoint in the v8 debugger.
- * @param {boolean} enabled Whether to enable the breakpoint.
- * @param {?string} condition New breakpoint condition.
- * @param {number} ignoreCount New ignore count for the breakpoint.
- */
-devtools.DebuggerAgent.prototype.requestChangeBreakpoint_ = function(breakpointId, enabled, condition, ignoreCount)
-{
- var cmd = new devtools.DebugCommand("changebreakpoint", {
- "breakpoint": breakpointId,
- "enabled": enabled,
- "condition": condition,
- "ignoreCount": ignoreCount
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends "backtrace" request to v8.
- */
-devtools.DebuggerAgent.prototype.requestBacktrace_ = function()
-{
- var cmd = new devtools.DebugCommand("backtrace", {
- "compactFormat":true
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends command to v8 debugger.
- * @param {devtools.DebugCommand} cmd Command to execute.
- */
-devtools.DebuggerAgent.sendCommand_ = function(cmd)
-{
- RemoteDebuggerCommandExecutor.DebuggerCommand(cmd.toJSONProtocol());
-};
-
-
-/**
- * Tells the v8 debugger to make the next execution step.
- * @param {string} action "in", "out" or "next" action.
- */
-devtools.DebuggerAgent.prototype.stepCommand_ = function(action)
-{
- this.clearExceptionMessage_();
- var cmd = new devtools.DebugCommand("continue", {
- "stepaction": action,
- "stepcount": 1
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends "lookup" request to v8.
- * @param {number} handle Handle to the object to lookup.
- */
-devtools.DebuggerAgent.prototype.requestLookup_ = function(handles, callback)
-{
- var cmd = new devtools.DebugCommand("lookup", {
- "compactFormat":true,
- "handles": handles
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
- this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
-};
-
-
-/**
- * Sets debugger context id for scripts filtering.
- * @param {number} contextId Id of the inspected page global context.
- */
-devtools.DebuggerAgent.prototype.setContextId_ = function(contextId)
-{
- this.contextId_ = contextId;
-
- // If it's the first time context id is set request scripts list.
- if (this.requestScriptsWhenContextIdSet_) {
- this.requestScriptsWhenContextIdSet_ = false;
- var cmd = new devtools.DebugCommand("scripts", {
- "includeSource": false
- });
- devtools.DebuggerAgent.sendCommand_(cmd);
- // Force v8 execution so that it gets to processing the requested command.
- RemoteDebuggerAgent.processDebugCommands();
-
- var debuggerAgent = this;
- this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
- // Handle the response iff the context id hasn't changed since the request
- // was issued. Otherwise if the context id did change all up-to-date
- // scripts will be pushed in after compile events and there is no need to
- // handle the response.
- if (contextId === debuggerAgent.contextId_)
- debuggerAgent.handleScriptsResponse_(msg);
-
- // We received initial scripts response so flush the flag and
- // see if there is an unhandled backtrace response.
- debuggerAgent.waitingForInitialScriptsResponse_ = false;
- if (debuggerAgent.pendingBacktraceResponseHandler_) {
- debuggerAgent.pendingBacktraceResponseHandler_();
- debuggerAgent.pendingBacktraceResponseHandler_ = null;
- }
- };
- }
-};
-
-
-/**
- * Handles output sent by v8 debugger. The output is either asynchronous event
- * or response to a previously sent request. See protocol definitioun for more
- * details on the output format.
- * @param {string} output
- */
-devtools.DebuggerAgent.prototype.handleDebuggerOutput_ = function(output)
-{
- var msg;
- try {
- msg = new devtools.DebuggerMessage(output);
- } catch(e) {
- debugPrint("Failed to handle debugger response:\n" + e);
- throw e;
- }
-
- if (msg.getType() === "event") {
- if (msg.getEvent() === "break")
- this.handleBreakEvent_(msg);
- else if (msg.getEvent() === "exception")
- this.handleExceptionEvent_(msg);
- else if (msg.getEvent() === "afterCompile")
- this.handleAfterCompileEvent_(msg);
- } else if (msg.getType() === "response") {
- if (msg.getCommand() === "scripts")
- this.invokeCallbackForResponse_(msg);
- else if (msg.getCommand() === "setbreakpoint")
- this.handleSetBreakpointResponse_(msg);
- else if (msg.getCommand() === "clearbreakpoint")
- this.handleClearBreakpointResponse_(msg);
- else if (msg.getCommand() === "backtrace")
- this.handleBacktraceResponse_(msg);
- else if (msg.getCommand() === "lookup")
- this.invokeCallbackForResponse_(msg);
- else if (msg.getCommand() === "evaluate")
- this.invokeCallbackForResponse_(msg);
- else if (msg.getCommand() === "scope")
- this.invokeCallbackForResponse_(msg);
- }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleBreakEvent_ = function(msg)
-{
- // Force scrips panel to be shown first.
- WebInspector.currentPanel = WebInspector.panels.scripts;
-
- var body = msg.getBody();
-
- var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
- this.requestBacktrace_();
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleExceptionEvent_ = function(msg)
-{
- // Force scrips panel to be shown first.
- WebInspector.currentPanel = WebInspector.panels.scripts;
-
- var body = msg.getBody();
- // No script field in the body means that v8 failed to parse the script. We
- // resume execution on parser errors automatically.
- if (this.pauseOnExceptions_ && body.script) {
- var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
- this.createExceptionMessage_(body.script.name, line, body.exception.text);
- this.requestBacktrace_();
- } else
- this.resumeExecution();
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleScriptsResponse_ = function(msg)
-{
- var scripts = msg.getBody();
- for (var i = 0; i < scripts.length; i++) {
- var script = scripts[i];
-
- // Skip scripts from other tabs.
- if (!this.isScriptFromInspectedContext_(script, msg))
- continue;
-
- // We may already have received the info in an afterCompile event.
- if (script.id in this.parsedScripts_)
- continue;
- this.addScriptInfo_(script, msg);
- }
-};
-
-
-/**
- * @param {Object} script Json object representing script.
- * @param {devtools.DebuggerMessage} msg Debugger response.
- */
-devtools.DebuggerAgent.prototype.isScriptFromInspectedContext_ = function(script, msg)
-{
- if (!script.context) {
- // Always ignore scripts from the utility context.
- return false;
- }
- var context = msg.lookup(script.context.ref);
- var scriptContextId = context.data;
- if (typeof scriptContextId === "undefined")
- return false; // Always ignore scripts from the utility context.
- if (this.contextId_ === null)
- return true;
- // Find the id from context data. The context data has the format "type,id".
- var comma = context.data.indexOf(",");
- if (comma < 0)
- return false;
- return (context.data.substring(comma + 1) == this.contextId_);
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleSetBreakpointResponse_ = function(msg)
-{
- var requestSeq = msg.getRequestSeq();
- var breakpointInfo = this.requestNumberToBreakpointInfo_[requestSeq];
- if (!breakpointInfo) {
- // TODO(yurys): handle this case
- return;
- }
- delete this.requestNumberToBreakpointInfo_[requestSeq];
- if (!msg.isSuccess()) {
- // TODO(yurys): handle this case
- return;
- }
- var idInV8 = msg.getBody().breakpoint;
- breakpointInfo.setV8Id(idInV8);
-
- if (breakpointInfo.isRemoved())
- this.requestClearBreakpoint_(idInV8);
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleAfterCompileEvent_ = function(msg)
-{
- if (!this.contextId_) {
- // Ignore scripts delta if main request has not been issued yet.
- return;
- }
- var script = msg.getBody().script;
-
- // Ignore scripts from other tabs.
- if (!this.isScriptFromInspectedContext_(script, msg))
- return;
- this.addScriptInfo_(script, msg);
-};
-
-
-/**
- * Adds the script info to the local cache. This method assumes that the script
- * is not in the cache yet.
- * @param {Object} script Script json object from the debugger message.
- * @param {devtools.DebuggerMessage} msg Debugger message containing the script
- * data.
- */
-devtools.DebuggerAgent.prototype.addScriptInfo_ = function(script, msg)
-{
- var context = msg.lookup(script.context.ref);
- var contextType;
- // Find the type from context data. The context data has the format
- // "type,id".
- var comma = context.data.indexOf(",");
- if (comma < 0)
- return
- contextType = context.data.substring(0, comma);
- this.parsedScripts_[script.id] = new devtools.ScriptInfo(script.id, script.name, script.lineOffset, contextType);
- if (this.scriptsPanelInitialized_) {
- // Only report script as parsed after scripts panel has been shown.
- WebInspector.parsedScriptSource(script.id, script.name, script.source, script.lineOffset);
- }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleClearBreakpointResponse_ = function(msg)
-{
- // Do nothing.
-};
-
-
-/**
- * Handles response to "backtrace" command.
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleBacktraceResponse_ = function(msg)
-{
- if (this.waitingForInitialScriptsResponse_)
- this.pendingBacktraceResponseHandler_ = this.doHandleBacktraceResponse_.bind(this, msg);
- else
- this.doHandleBacktraceResponse_(msg);
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.doHandleBacktraceResponse_ = function(msg)
-{
- var frames = msg.getBody().frames;
- this.callFrames_ = [];
- for (var i = 0; i < frames.length; ++i)
- this.callFrames_.push(this.formatCallFrame_(frames[i]));
- WebInspector.pausedScript(this.callFrames_);
- this.showPendingExceptionMessage_();
- InspectorFrontendHost.activateWindow();
-};
-
-
-/**
- * Evaluates code on given callframe.
- */
-devtools.DebuggerAgent.prototype.evaluateInCallFrame = function(callFrameId, code, callback)
-{
- var callFrame = this.callFrames_[callFrameId];
- callFrame.evaluate_(code, callback);
-};
-
-
-/**
- * Handles response to a command by invoking its callback (if any).
- * @param {devtools.DebuggerMessage} msg
- * @return {boolean} Whether a callback for the given message was found and
- * excuted.
- */
-devtools.DebuggerAgent.prototype.invokeCallbackForResponse_ = function(msg)
-{
- var callback = this.requestSeqToCallback_[msg.getRequestSeq()];
- if (!callback) {
- // It may happend if reset was called.
- return false;
- }
- delete this.requestSeqToCallback_[msg.getRequestSeq()];
- callback(msg);
- return true;
-};
-
-
-/**
- * @param {Object} stackFrame Frame json object from "backtrace" response.
- * @return {!devtools.CallFrame} Object containing information related to the
- * call frame in the format expected by ScriptsPanel and its panes.
- */
-devtools.DebuggerAgent.prototype.formatCallFrame_ = function(stackFrame)
-{
- var func = stackFrame.func;
- var sourceId = func.scriptId;
-
- // Add service script if it does not exist.
- var existingScript = this.parsedScripts_[sourceId];
- if (!existingScript) {
- this.parsedScripts_[sourceId] = new devtools.ScriptInfo(sourceId, null /* name */, 0 /* line */, "unknown" /* type */, true /* unresolved */);
- WebInspector.parsedScriptSource(sourceId, null, null, 0);
- }
-
- var funcName = func.name || func.inferredName || "(anonymous function)";
- var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(stackFrame.line);
-
- // Add basic scope chain info with scope variables.
- var scopeChain = [];
- var ScopeType = devtools.DebuggerAgent.ScopeType;
- for (var i = 0; i < stackFrame.scopes.length; i++) {
- var scope = stackFrame.scopes[i];
- scope.frameNumber = stackFrame.index;
- var scopeObjectProxy = new WebInspector.ObjectProxy(0, scope, [], 0, "", true);
- scopeObjectProxy.isScope = true;
- switch(scope.type) {
- case ScopeType.Global:
- scopeObjectProxy.isDocument = true;
- break;
- case ScopeType.Local:
- scopeObjectProxy.isLocal = true;
- scopeObjectProxy.thisObject = devtools.DebuggerAgent.formatObjectProxy_(stackFrame.receiver);
- break;
- case ScopeType.With:
- // Catch scope is treated as a regular with scope by WebKit so we
- // also treat it this way.
- case ScopeType.Catch:
- scopeObjectProxy.isWithBlock = true;
- break;
- case ScopeType.Closure:
- scopeObjectProxy.isClosure = true;
- break;
- }
- scopeChain.push(scopeObjectProxy);
- }
- return new devtools.CallFrame(stackFrame.index, "function", funcName, sourceId, line, scopeChain);
-};
-
-
-/**
- * Collects properties for an object from the debugger response.
- * @param {Object} object An object from the debugger protocol response.
- * @param {Array.<WebInspector.ObjectPropertyProxy>} result An array to put the
- * properties into.
- * @param {boolean} noIntrinsic Whether intrinsic properties should be
- * included.
- */
-devtools.DebuggerAgent.formatObjectProperties_ = function(object, result, noIntrinsic)
-{
- devtools.DebuggerAgent.propertiesToProxies_(object.properties, result);
- if (noIntrinsic)
- return;
-
- result.push(new WebInspector.ObjectPropertyProxy("__proto__", devtools.DebuggerAgent.formatObjectProxy_(object.protoObject)));
- result.push(new WebInspector.ObjectPropertyProxy("constructor", devtools.DebuggerAgent.formatObjectProxy_(object.constructorFunction)));
- // Don't add 'prototype' property since it is one of the regualar properties.
-};
-
-
-/**
- * For each property in "properties" creates its proxy representative.
- * @param {Array.<Object>} properties Receiver properties or locals array from
- * "backtrace" response.
- * @param {Array.<WebInspector.ObjectPropertyProxy>} Results holder.
- */
-devtools.DebuggerAgent.propertiesToProxies_ = function(properties, result)
-{
- var map = {};
- for (var i = 0; i < properties.length; ++i) {
- var property = properties[i];
- var name = String(property.name);
- if (name in map)
- continue;
- map[name] = true;
- var value = devtools.DebuggerAgent.formatObjectProxy_(property.value);
- var propertyProxy = new WebInspector.ObjectPropertyProxy(name, value);
- result.push(propertyProxy);
- }
-};
-
-
-/**
- * @param {Object} v An object reference from the debugger response.
- * @return {*} The value representation expected by ScriptsPanel.
- */
-devtools.DebuggerAgent.formatObjectProxy_ = function(v)
-{
- var description;
- var hasChildren = false;
- if (v.type === "object") {
- description = v.className;
- hasChildren = true;
- } else if (v.type === "function") {
- if (v.source)
- description = v.source;
- else
- description = "function " + v.name + "()";
- hasChildren = true;
- } else if (v.type === "undefined")
- description = "undefined";
- else if (v.type === "null")
- description = "null";
- else if (typeof v.value !== "undefined") {
- // Check for undefined and null types before checking the value, otherwise
- // null/undefined may have blank value.
- description = v.value;
- } else
- description = "<unresolved ref: " + v.ref + ", type: " + v.type + ">";
-
- var proxy = new WebInspector.ObjectProxy(0, v, [], 0, description, hasChildren);
- proxy.type = v.type;
- proxy.isV8Ref = true;
- return proxy;
-};
-
-
-/**
- * Converts line number from Web Inspector UI(1-based) to v8(0-based).
- * @param {number} line Resource line number in Web Inspector UI.
- * @return {number} The line number in v8.
- */
-devtools.DebuggerAgent.webkitToV8LineNumber_ = function(line)
-{
- return line - 1;
-};
-
-
-/**
- * Converts line number from v8(0-based) to Web Inspector UI(1-based).
- * @param {number} line Resource line number in v8.
- * @return {number} The line number in Web Inspector.
- */
-devtools.DebuggerAgent.v8ToWwebkitLineNumber_ = function(line)
-{
- return line + 1;
-};
-
-
-/**
- * @param {number} scriptId Id of the script.
- * @param {?string} url Script resource URL if any.
- * @param {number} lineOffset First line 0-based offset in the containing
- * document.
- * @param {string} contextType Type of the script's context:
- * "page" - regular script from html page
- * "injected" - extension content script
- * @param {bool} opt_isUnresolved If true, script will not be resolved.
- * @constructor
- */
-devtools.ScriptInfo = function(scriptId, url, lineOffset, contextType, opt_isUnresolved)
-{
- this.scriptId_ = scriptId;
- this.lineOffset_ = lineOffset;
- this.contextType_ = contextType;
- this.url_ = url;
- this.isUnresolved_ = opt_isUnresolved;
-
- this.lineToBreakpointInfo_ = {};
-};
-
-
-/**
- * @return {number}
- */
-devtools.ScriptInfo.prototype.getLineOffset = function()
-{
- return this.lineOffset_;
-};
-
-
-/**
- * @return {string}
- */
-devtools.ScriptInfo.prototype.getContextType = function()
-{
- return this.contextType_;
-};
-
-
-/**
- * @return {?string}
- */
-devtools.ScriptInfo.prototype.getUrl = function()
-{
- return this.url_;
-};
-
-
-/**
- * @return {?bool}
- */
-devtools.ScriptInfo.prototype.isUnresolved = function()
-{
- return this.isUnresolved_;
-};
-
-
-/**
- * @param {number} line 0-based line number in the script.
- * @return {?devtools.BreakpointInfo} Information on a breakpoint at the
- * specified line in the script or undefined if there is no breakpoint at
- * that line.
- */
-devtools.ScriptInfo.prototype.getBreakpointInfo = function(line)
-{
- return this.lineToBreakpointInfo_[line];
-};
-
-
-/**
- * Adds breakpoint info to the script.
- * @param {devtools.BreakpointInfo} breakpoint
- */
-devtools.ScriptInfo.prototype.addBreakpointInfo = function(breakpoint)
-{
- this.lineToBreakpointInfo_[breakpoint.getLine()] = breakpoint;
-};
-
-
-/**
- * @param {devtools.BreakpointInfo} breakpoint Breakpoint info to be removed.
- */
-devtools.ScriptInfo.prototype.removeBreakpointInfo = function(breakpoint)
-{
- var line = breakpoint.getLine();
- delete this.lineToBreakpointInfo_[line];
-};
-
-
-
-/**
- * @param {number} line Breakpoint 0-based line number in the containing script.
- * @constructor
- */
-devtools.BreakpointInfo = function(line)
-{
- this.line_ = line;
- this.v8id_ = -1;
- this.removed_ = false;
-};
-
-
-/**
- * @return {number}
- */
-devtools.BreakpointInfo.prototype.getLine = function(n)
-{
- return this.line_;
-};
-
-
-/**
- * @return {number} Unique identifier of this breakpoint in the v8 debugger.
- */
-devtools.BreakpointInfo.prototype.getV8Id = function(n)
-{
- return this.v8id_;
-};
-
-
-/**
- * Sets id of this breakpoint in the v8 debugger.
- * @param {number} id
- */
-devtools.BreakpointInfo.prototype.setV8Id = function(id)
-{
- this.v8id_ = id;
-};
-
-
-/**
- * Marks this breakpoint as removed from the front-end.
- */
-devtools.BreakpointInfo.prototype.markAsRemoved = function()
-{
- this.removed_ = true;
-};
-
-
-/**
- * @return {boolean} Whether this breakpoint has been removed from the
- * front-end.
- */
-devtools.BreakpointInfo.prototype.isRemoved = function()
-{
- return this.removed_;
-};
-
-
-/**
- * Call stack frame data.
- * @param {string} id CallFrame id.
- * @param {string} type CallFrame type.
- * @param {string} functionName CallFrame type.
- * @param {string} sourceID Source id.
- * @param {number} line Source line.
- * @param {Array.<Object>} scopeChain Array of scoped objects.
- * @construnctor
- */
-devtools.CallFrame = function(id, type, functionName, sourceID, line, scopeChain)
-{
- this.id = id;
- this.type = type;
- this.functionName = functionName;
- this.sourceID = sourceID;
- this.line = line;
- this.scopeChain = scopeChain;
-};
-
-
-/**
- * This method issues asynchronous evaluate request, reports result to the
- * callback.
- * @param {string} expression An expression to be evaluated in the context of
- * this call frame.
- * @param {function(Object):undefined} callback Callback to report result to.
- */
-devtools.CallFrame.prototype.evaluate_ = function(expression, callback)
-{
- devtools.tools.getDebuggerAgent().requestEvaluate({
- "expression": expression,
- "frame": this.id,
- "global": false,
- "disable_break": false,
- "compactFormat": true
- },
- function(response) {
- var result = {};
- if (response.isSuccess())
- result.value = devtools.DebuggerAgent.formatObjectProxy_(response.getBody());
- else {
- result.value = response.getMessage();
- result.isException = true;
- }
- callback(result);
- });
-};
-
-
-/**
- * JSON based commands sent to v8 debugger.
- * @param {string} command Name of the command to execute.
- * @param {Object} opt_arguments Command-specific arguments map.
- * @constructor
- */
-devtools.DebugCommand = function(command, opt_arguments)
-{
- this.command_ = command;
- this.type_ = "request";
- this.seq_ = ++devtools.DebugCommand.nextSeq_;
- if (opt_arguments)
- this.arguments_ = opt_arguments;
-};
-
-
-/**
- * Next unique number to be used as debugger request sequence number.
- * @type {number}
- */
-devtools.DebugCommand.nextSeq_ = 1;
-
-
-/**
- * @return {number}
- */
-devtools.DebugCommand.prototype.getSequenceNumber = function()
-{
- return this.seq_;
-};
-
-
-/**
- * @return {string}
- */
-devtools.DebugCommand.prototype.toJSONProtocol = function()
-{
- var json = {
- "seq": this.seq_,
- "type": this.type_,
- "command": this.command_
- }
- if (this.arguments_)
- json.arguments = this.arguments_;
- return JSON.stringify(json);
-};
-
-
-/**
- * JSON messages sent from v8 debugger. See protocol definition for more
- * details: http://code.google.com/p/v8/wiki/DebuggerProtocol
- * @param {string} msg Raw protocol packet as JSON string.
- * @constructor
- */
-devtools.DebuggerMessage = function(msg)
-{
- this.packet_ = JSON.parse(msg);
- this.refs_ = [];
- if (this.packet_.refs) {
- for (var i = 0; i < this.packet_.refs.length; i++)
- this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
- }
-};
-
-
-/**
- * @return {string} The packet type.
- */
-devtools.DebuggerMessage.prototype.getType = function()
-{
- return this.packet_.type;
-};
-
-
-/**
- * @return {?string} The packet event if the message is an event.
- */
-devtools.DebuggerMessage.prototype.getEvent = function()
-{
- return this.packet_.event;
-};
-
-
-/**
- * @return {?string} The packet command if the message is a response to a
- * command.
- */
-devtools.DebuggerMessage.prototype.getCommand = function()
-{
- return this.packet_.command;
-};
-
-
-/**
- * @return {number} The packet request sequence.
- */
-devtools.DebuggerMessage.prototype.getRequestSeq = function()
-{
- return this.packet_.request_seq;
-};
-
-
-/**
- * @return {number} Whether the v8 is running after processing the request.
- */
-devtools.DebuggerMessage.prototype.isRunning = function()
-{
- return this.packet_.running ? true : false;
-};
-
-
-/**
- * @return {boolean} Whether the request succeeded.
- */
-devtools.DebuggerMessage.prototype.isSuccess = function()
-{
- return this.packet_.success ? true : false;
-};
-
-
-/**
- * @return {string}
- */
-devtools.DebuggerMessage.prototype.getMessage = function()
-{
- return this.packet_.message;
-};
-
-
-/**
- * @return {Object} Parsed message body json.
- */
-devtools.DebuggerMessage.prototype.getBody = function()
-{
- return this.packet_.body;
-};
-
-
-/**
- * @param {number} handle Object handle.
- * @return {?Object} Returns the object with the handle if it was sent in this
- * message(some objects referenced by handles may be missing in the message).
- */
-devtools.DebuggerMessage.prototype.lookup = function(handle)
-{
- return this.refs_[handle];
-};
diff --git a/WebKit/chromium/src/js/DevTools.js b/WebKit/chromium/src/js/DevTools.js
index dcb181b..11ebc1f 100644
--- a/WebKit/chromium/src/js/DevTools.js
+++ b/WebKit/chromium/src/js/DevTools.js
@@ -35,286 +35,38 @@
* WebInspector functionality while it is getting upstreamed into WebCore.
*/
-/**
- * Dispatches raw message from the host.
- * @param {string} remoteName
- * @prama {string} methodName
- * @param {string} param1, param2, param3 Arguments to dispatch.
- */
-devtools$$dispatch = function(remoteName, methodName, param1, param2, param3)
-{
- remoteName = "Remote" + remoteName.substring(0, remoteName.length - 8);
- var agent = window[remoteName];
- if (!agent) {
- debugPrint("No remote agent '" + remoteName + "' found.");
- return;
- }
- var method = agent[methodName];
- if (!method) {
- debugPrint("No method '" + remoteName + "." + methodName + "' found.");
- return;
- }
- method.call(this, param1, param2, param3);
-};
-
-
-devtools.ToolsAgent = function()
-{
- RemoteToolsAgent.didDispatchOn = WebInspector.Callback.processCallback;
- RemoteToolsAgent.frameNavigate = this.frameNavigate_.bind(this);
- RemoteToolsAgent.dispatchOnClient = this.dispatchOnClient_.bind(this);
- this.debuggerAgent_ = new devtools.DebuggerAgent();
- this.profilerAgent_ = new devtools.ProfilerAgent();
-};
-
-
-/**
- * Resets tools agent to its initial state.
- */
-devtools.ToolsAgent.prototype.reset = function()
-{
- this.debuggerAgent_.reset();
-};
-
-
-/**
- * @param {string} script Script exression to be evaluated in the context of the
- * inspected page.
- * @param {function(Object|string, boolean):undefined} opt_callback Function to
- * call with the result.
- */
-devtools.ToolsAgent.prototype.evaluateJavaScript = function(script, opt_callback)
-{
- InspectorBackend.evaluate(script, opt_callback || function() {});
-};
-
-
-/**
- * @return {devtools.DebuggerAgent} Debugger agent instance.
- */
-devtools.ToolsAgent.prototype.getDebuggerAgent = function()
-{
- return this.debuggerAgent_;
-};
-
-
-/**
- * @return {devtools.ProfilerAgent} Profiler agent instance.
- */
-devtools.ToolsAgent.prototype.getProfilerAgent = function()
-{
- return this.profilerAgent_;
-};
-
-
-/**
- * @param {string} url Url frame navigated to.
- * @see tools_agent.h
- * @private
- */
-devtools.ToolsAgent.prototype.frameNavigate_ = function(url)
-{
- this.reset();
- // Do not reset Profiles panel.
- var profiles = null;
- if ("profiles" in WebInspector.panels) {
- profiles = WebInspector.panels["profiles"];
- delete WebInspector.panels["profiles"];
- }
- WebInspector.reset();
- if (profiles !== null)
- WebInspector.panels["profiles"] = profiles;
-};
-
-
-/**
- * @param {string} message Serialized call to be dispatched on WebInspector.
- * @private
- */
-devtools.ToolsAgent.prototype.dispatchOnClient_ = function(message)
-{
- var args = JSON.parse(message);
- var methodName = args[0];
- var parameters = args.slice(1);
- WebInspector[methodName].apply(WebInspector, parameters);
-};
-
-
-/**
- * Evaluates js expression.
- * @param {string} expr
- */
-devtools.ToolsAgent.prototype.evaluate = function(expr)
-{
- RemoteToolsAgent.evaluate(expr);
-};
-
-
-/**
- * Enables / disables resources panel in the ui.
- * @param {boolean} enabled New panel status.
- */
-WebInspector.setResourcesPanelEnabled = function(enabled)
-{
- InspectorBackend._resourceTrackingEnabled = enabled;
- WebInspector.panels.resources.reset();
-};
-
-
-/**
- * Prints string to the inspector console or shows alert if the console doesn't
- * exist.
- * @param {string} text
- */
-function debugPrint(text) {
- var console = WebInspector.console;
- if (console) {
- console.addMessage(new WebInspector.ConsoleMessage(
- WebInspector.ConsoleMessage.MessageSource.JS,
- WebInspector.ConsoleMessage.MessageType.Log,
- WebInspector.ConsoleMessage.MessageLevel.Log,
- 1, "chrome://devtools/<internal>", undefined, -1, text));
- } else
- alert(text);
-}
-
-
-/**
- * Global instance of the tools agent.
- * @type {devtools.ToolsAgent}
- */
-devtools.tools = null;
-
-
var context = {}; // Used by WebCore's inspector routines.
-///////////////////////////////////////////////////////////////////////////////
-// Here and below are overrides to existing WebInspector methods only.
-// TODO(pfeldman): Patch WebCore and upstream changes.
-var oldLoaded = WebInspector.loaded;
-WebInspector.loaded = function()
-{
- devtools.tools = new devtools.ToolsAgent();
- devtools.tools.reset();
-
+(function () {
Preferences.ignoreWhitespace = false;
Preferences.samplingCPUProfiler = true;
Preferences.heapProfilerPresent = true;
- oldLoaded.call(this);
-
- InspectorFrontendHost.loaded();
-};
-
-
-(function()
-{
-
- /**
- * Handles an F3 keydown event to focus the Inspector search box.
- * @param {KeyboardEvent} event Event to optionally handle
- * @return {boolean} whether the event has been handled
- */
- function handleF3Keydown(event) {
- if (event.keyIdentifier === "F3" && !event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {
- var searchField = document.getElementById("search");
- searchField.focus();
- searchField.select();
- event.preventDefault();
- return true;
- }
- return false;
- }
-
-
- var oldKeyDown = WebInspector.documentKeyDown;
- /**
- * This override allows to intercept keydown events we want to handle in a
- * custom way. Some nested documents (iframes) delegate keydown handling to
- * WebInspector.documentKeyDown (e.g. SourceFrame).
- * @param {KeyboardEvent} event
- * @override
- */
- WebInspector.documentKeyDown = function(event) {
- var isHandled = handleF3Keydown(event);
- if (!isHandled) {
- // Mute refresh action.
- if (event.keyIdentifier === "F5")
- event.preventDefault();
- else if (event.keyIdentifier === "U+0052" /* "R" */ && (event.ctrlKey || event.metaKey))
- event.preventDefault();
- else
- oldKeyDown.call(this, event);
- }
- };
+ Preferences.debuggerAlwaysEnabled = true;
+ Preferences.profilerAlwaysEnabled = true;
+ Preferences.canEditScriptSource = true;
+ Preferences.onlineDetectionEnabled = false;
+ Preferences.nativeInstrumentationEnabled = true;
+ Preferences.fileSystemEnabled = false;
+ Preferences.showTimingTab = true;
})();
+var devtools = devtools || {};
-/**
- * This override is necessary for adding script source asynchronously.
- * @override
- */
-WebInspector.ScriptView.prototype.setupSourceFrameIfNeeded = function()
+devtools.domContentLoaded = function()
{
- if (!this._frameNeedsSetup)
- return;
-
- this.attach();
-
- if (this.script.source)
- this.didResolveScriptSource_();
- else {
- var self = this;
- devtools.tools.getDebuggerAgent().resolveScriptSource(
- this.script.sourceID,
- function(source) {
- self.script.source = source || WebInspector.UIString("<source is not available>");
- self.didResolveScriptSource_();
- });
- }
-};
-
-
-/**
- * Performs source frame setup when script source is aready resolved.
- */
-WebInspector.ScriptView.prototype.didResolveScriptSource_ = function()
-{
- this.sourceFrame.setContent("text/javascript", this.script.source);
- this._sourceFrameSetup = true;
- delete this._frameNeedsSetup;
-};
-
-
-/**
- * @param {string} type Type of the the property value("object" or "function").
- * @param {string} className Class name of the property value.
- * @constructor
- */
-WebInspector.UnresolvedPropertyValue = function(type, className)
-{
- this.type = type;
- this.className = className;
-};
-
-
-(function()
-{
- var oldShow = WebInspector.ScriptsPanel.prototype.show;
- WebInspector.ScriptsPanel.prototype.show = function()
- {
- devtools.tools.getDebuggerAgent().initUI();
- this.enableToggleButton.visible = false;
- oldShow.call(this);
- };
-})();
+ WebInspector.setAttachedWindow(WebInspector.queryParamsObject.docked === "true");
+ if (WebInspector.queryParamsObject.toolbar_color && WebInspector.queryParamsObject.text_color)
+ WebInspector.setToolbarColors(WebInspector.queryParamsObject.toolbar_color, WebInspector.queryParamsObject.text_color);
+}
+document.addEventListener("DOMContentLoaded", devtools.domContentLoaded, false);
+// FIXME: This needs to be upstreamed.
(function InterceptProfilesPanelEvents()
{
var oldShow = WebInspector.ProfilesPanel.prototype.show;
WebInspector.ProfilesPanel.prototype.show = function()
{
- devtools.tools.getProfilerAgent().initializeProfiling();
this.enableToggleButton.visible = false;
oldShow.call(this);
// Show is called on every show event of a panel, so
@@ -334,36 +86,6 @@ WebInspector.UIString = function(string)
};
-// There is no clear way of setting frame title yet. So sniffing main resource
-// load.
-(function OverrideUpdateResource() {
- var originalUpdateResource = WebInspector.updateResource;
- WebInspector.updateResource = function(identifier, payload)
- {
- originalUpdateResource.call(this, identifier, payload);
- var resource = this.resources[identifier];
- if (resource && resource.mainResource && resource.finished)
- document.title = WebInspector.UIString("Developer Tools - %s", resource.url);
- };
-})();
-
-
-// Highlight extension content scripts in the scripts list.
-(function () {
- var original = WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu;
- WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu = function(script)
- {
- var result = original.apply(this, arguments);
- var debuggerAgent = devtools.tools.getDebuggerAgent();
- var type = debuggerAgent.getScriptContextType(script.sourceID);
- var option = script.filesSelectOption;
- if (type === "injected" && option)
- option.addStyleClass("injected");
- return result;
- };
-})();
-
-
/** Pending WebKit upstream by apavlov). Fixes iframe vs drag problem. */
(function()
{
@@ -392,113 +114,75 @@ WebInspector.UIString = function(string)
})();
-(function () {
-var orig = InjectedScriptAccess.prototype.getProperties;
-InjectedScriptAccess.prototype.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate, callback)
-{
- if (objectProxy.isScope)
- devtools.tools.getDebuggerAgent().resolveScope(objectProxy.objectId, callback);
- else if (objectProxy.isV8Ref)
- devtools.tools.getDebuggerAgent().resolveChildren(objectProxy.objectId, callback, false);
- else
- orig.apply(this, arguments);
-};
-})();
+///////////////////////////////////////////
+// Chromium layout test harness support. //
+///////////////////////////////////////////
-(function()
-{
-InjectedScriptAccess.prototype.evaluateInCallFrame = function(callFrameId, code, objectGroup, callback)
-{
- //TODO(pfeldman): remove once 49084 is rolled.
- if (!callback)
- callback = objectGroup;
- devtools.tools.getDebuggerAgent().evaluateInCallFrame(callFrameId, code, callback);
-};
-})();
-
+WebInspector.runAfterPendingDispatchesQueue = [];
-WebInspector.resourceTrackingWasEnabled = function()
+WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback)
{
- InspectorBackend._resourceTrackingEnabled = true;
- this.panels.resources.resourceTrackingWasEnabled();
+ WebInspector.runAfterPendingDispatchesQueue.push(callback);
};
-WebInspector.resourceTrackingWasDisabled = function()
+WebInspector.queuesAreEmpty = function()
{
- InspectorBackend._resourceTrackingEnabled = false;
- this.panels.resources.resourceTrackingWasDisabled();
+ var copy = this.runAfterPendingDispatchesQueue.slice();
+ this.runAfterPendingDispatchesQueue = [];
+ for (var i = 0; i < copy.length; ++i)
+ copy[i].call(this);
};
-(function()
-{
-var orig = WebInspector.ConsoleMessage.prototype.setMessageBody;
-WebInspector.ConsoleMessage.prototype.setMessageBody = function(args)
-{
- for (var i = 0; i < args.length; ++i) {
- if (typeof args[i] === "string")
- args[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(args[i]);
- }
- orig.call(this, args);
-};
-})();
+/////////////////////////////
+// Chromium theme support. //
+/////////////////////////////
-(function()
+WebInspector.setToolbarColors = function(backgroundColor, color)
{
-var orig = InjectedScriptAccess.prototype.getCompletions;
-InjectedScriptAccess.prototype.getCompletions = function(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions)
-{
- if (typeof callFrameId === "number")
- devtools.tools.getDebuggerAgent().resolveCompletionsOnFrame(expressionString, callFrameId, reportCompletions);
- else
- return orig.apply(this, arguments);
-};
-})();
-
+ if (!WebInspector._themeStyleElement) {
+ WebInspector._themeStyleElement = document.createElement("style");
+ document.head.appendChild(WebInspector._themeStyleElement);
+ }
+ WebInspector._themeStyleElement.textContent =
+ "#toolbar {\
+ background-image: none !important;\
+ background-color: " + backgroundColor + " !important;\
+ }\
+ \
+ .toolbar-label {\
+ color: " + color + " !important;\
+ text-shadow: none;\
+ }";
+}
-(function()
-{
-WebInspector.ElementsPanel.prototype._nodeSearchButtonClicked = function( event)
+WebInspector.resetToolbarColors = function()
{
- InspectorBackend.toggleNodeSearch();
- this.nodeSearchButton.toggled = !this.nodeSearchButton.toggled;
-};
-})();
-
+ if (WebInspector._themeStyleElement)
+ WebInspector._themeStyleElement.textContent = "";
-// We need to have a place for postponed tasks
-// which should be executed when all the messages between agent and frontend
-// are processed.
-
-WebInspector.runAfterPendingDispatchesQueue = [];
+}
-WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback)
-{
- WebInspector.runAfterPendingDispatchesQueue.push(callback);
-};
+////////////////////////////////////////////////////////
+// Platform-specific WebInspector extensions support. //
+////////////////////////////////////////////////////////
-WebInspector.queuesAreEmpty = function()
+WebInspector.platformExtensionAPI = function(tabId)
{
- var copy = this.runAfterPendingDispatchesQueue.slice();
- this.runAfterPendingDispatchesQueue = [];
- for (var i = 0; i < copy.length; ++i)
- copy[i].call(this);
-};
+ function getTabId()
+ {
+ return tabId;
+ }
+ webInspector.inspectedWindow.__proto__.__defineGetter__("tabId", getTabId);
+}
-(function()
-{
-var originalAddToFrame = InspectorFrontendHost.addResourceSourceToFrame;
-InspectorFrontendHost.addResourceSourceToFrame = function(identifier, element)
+WebInspector.buildPlatformExtensionAPI = function()
{
- var resource = WebInspector.resources[identifier];
- if (!resource)
- return;
- originalAddToFrame.call(this, identifier, resource.mimeType, element);
-};
-})();
+ return "(" + WebInspector.platformExtensionAPI + ")(" + WebInspector._inspectedTabId + ");";
+}
-WebInspector.pausedScript = function(callFrames)
+WebInspector.setInspectedTabId = function(tabId)
{
- this.panels.scripts.debuggerPaused(callFrames);
-};
+ WebInspector._inspectedTabId = tabId;
+}
diff --git a/WebKit/chromium/src/js/DevToolsHostStub.js b/WebKit/chromium/src/js/DevToolsHostStub.js
deleted file mode 100644
index 8b2f46b..0000000
--- a/WebKit/chromium/src/js/DevToolsHostStub.js
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-/**
- * @fileoverview These stubs emulate backend functionality and allows
- * DevTools frontend to function as a standalone web app.
- */
-
-if (!window["RemoteDebuggerAgent"]) {
-
-/**
- * FIXME: change field naming style to use trailing underscore.
- * @constructor
- */
-RemoteDebuggerAgentStub = function()
-{
-};
-
-
-RemoteDebuggerAgentStub.prototype.getContextId = function()
-{
- RemoteDebuggerAgent.setContextId(3);
-};
-
-
-RemoteDebuggerAgentStub.prototype.processDebugCommands = function()
-{
-};
-
-
-/**
- * @constructor
- */
-RemoteProfilerAgentStub = function()
-{
-};
-
-
-RemoteProfilerAgentStub.prototype.getActiveProfilerModules = function()
-{
- ProfilerStubHelper.GetInstance().getActiveProfilerModules();
-};
-
-
-RemoteProfilerAgentStub.prototype.getLogLines = function(pos)
-{
- ProfilerStubHelper.GetInstance().getLogLines(pos);
-};
-
-
-/**
- * @constructor
- */
-RemoteToolsAgentStub = function()
-{
-};
-
-
-RemoteToolsAgentStub.prototype.dispatchOnInjectedScript = function()
-{
-};
-
-
-RemoteToolsAgentStub.prototype.dispatchOnInspectorController = function()
-{
-};
-
-
-/**
- * @constructor
- */
-ProfilerStubHelper = function()
-{
- this.activeProfilerModules_ = devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
- this.heapProfSample_ = 0;
- this.log_ = '';
-};
-
-
-ProfilerStubHelper.GetInstance = function()
-{
- if (!ProfilerStubHelper.instance_)
- ProfilerStubHelper.instance_ = new ProfilerStubHelper();
- return ProfilerStubHelper.instance_;
-};
-
-
-ProfilerStubHelper.prototype.StopProfiling = function(modules)
-{
- this.activeProfilerModules_ &= ~modules;
-};
-
-
-ProfilerStubHelper.prototype.StartProfiling = function(modules)
-{
- var profModules = devtools.ProfilerAgent.ProfilerModules;
- if (modules & profModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
- if (modules & profModules.PROFILER_MODULE_HEAP_STATS) {
- this.log_ +=
- 'heap-sample-begin,"Heap","allocated",' +
- (new Date()).getTime() + '\n' +
- 'heap-sample-stats,"Heap","allocated",10000,1000\n';
- this.log_ +=
- 'heap-sample-item,STRING_TYPE,100,1000\n' +
- 'heap-sample-item,CODE_TYPE,10,200\n' +
- 'heap-sample-item,MAP_TYPE,20,350\n';
- this.log_ += ProfilerStubHelper.HeapSamples[this.heapProfSample_++];
- this.heapProfSample_ %= ProfilerStubHelper.HeapSamples.length;
- this.log_ += 'heap-sample-end,"Heap","allocated"\n';
- }
- } else {
- if (modules & profModules.PROFILER_MODULE_CPU)
- this.log_ += ProfilerStubHelper.ProfilerLogBuffer;
- this.activeProfilerModules_ |= modules;
- }
-};
-
-
-ProfilerStubHelper.prototype.getActiveProfilerModules = function()
-{
- var self = this;
- setTimeout(function() {
- RemoteProfilerAgent.didGetActiveProfilerModules(self.activeProfilerModules_);
- }, 100);
-};
-
-
-ProfilerStubHelper.prototype.getLogLines = function(pos)
-{
- var profModules = devtools.ProfilerAgent.ProfilerModules;
- var logLines = this.log_.substr(pos);
- setTimeout(function() {
- RemoteProfilerAgent.didGetLogLines(pos + logLines.length, logLines);
- }, 100);
-};
-
-
-ProfilerStubHelper.ProfilerLogBuffer =
- 'profiler,begin,1\n' +
- 'profiler,resume\n' +
- 'code-creation,LazyCompile,0x1000,256,"test1 http://aaa.js:1"\n' +
- 'code-creation,LazyCompile,0x2000,256,"test2 http://bbb.js:2"\n' +
- 'code-creation,LazyCompile,0x3000,256,"test3 http://ccc.js:3"\n' +
- 'tick,0x1010,0x0,3\n' +
- 'tick,0x2020,0x0,3,0x1010\n' +
- 'tick,0x2020,0x0,3,0x1010\n' +
- 'tick,0x3010,0x0,3,0x2020, 0x1010\n' +
- 'tick,0x2020,0x0,3,0x1010\n' +
- 'tick,0x2030,0x0,3,0x2020, 0x1010\n' +
- 'tick,0x2020,0x0,3,0x1010\n' +
- 'tick,0x1010,0x0,3\n' +
- 'profiler,pause\n';
-
-
-ProfilerStubHelper.HeapSamples = [
- 'heap-js-cons-item,foo,1,100\n' +
- 'heap-js-cons-item,bar,20,2000\n' +
- 'heap-js-cons-item,Object,5,100\n' +
- 'heap-js-ret-item,foo,bar;3\n' +
- 'heap-js-ret-item,bar,foo;5\n' +
- 'heap-js-ret-item,Object:0x1234,(roots);1\n',
-
- 'heap-js-cons-item,foo,2000,200000\n' +
- 'heap-js-cons-item,bar,10,1000\n' +
- 'heap-js-cons-item,Object,6,120\n' +
- 'heap-js-ret-item,foo,bar;7,Object:0x1234;10\n' +
- 'heap-js-ret-item,bar,foo;10,Object:0x1234;10\n' +
- 'heap-js-ret-item,Object:0x1234,(roots);1\n',
-
- 'heap-js-cons-item,foo,15,1500\n' +
- 'heap-js-cons-item,bar,15,1500\n' +
- 'heap-js-cons-item,Object,5,100\n' +
- 'heap-js-cons-item,Array,3,1000\n' +
- 'heap-js-ret-item,foo,bar;3,Array:0x5678;1\n' +
- 'heap-js-ret-item,bar,foo;5,Object:0x1234;8,Object:0x5678;2\n' +
- 'heap-js-ret-item,Object:0x1234,(roots);1,Object:0x5678;2\n' +
- 'heap-js-ret-item,Object:0x5678,(global property);3,Object:0x1234;5\n' +
- 'heap-js-ret-item,Array:0x5678,(global property);3,Array:0x5678;2\n',
-
- 'heap-js-cons-item,bar,20,2000\n' +
- 'heap-js-cons-item,Object,6,120\n' +
- 'heap-js-ret-item,bar,foo;5,Object:0x1234;1,Object:0x1235;3\n' +
- 'heap-js-ret-item,Object:0x1234,(global property);3\n' +
- 'heap-js-ret-item,Object:0x1235,(global property);5\n',
-
- 'heap-js-cons-item,foo,15,1500\n' +
- 'heap-js-cons-item,bar,15,1500\n' +
- 'heap-js-cons-item,Array,10,1000\n' +
- 'heap-js-ret-item,foo,bar;1,Array:0x5678;1\n' +
- 'heap-js-ret-item,bar,foo;5\n' +
- 'heap-js-ret-item,Array:0x5678,(roots);3\n',
-
- 'heap-js-cons-item,bar,20,2000\n' +
- 'heap-js-cons-item,baz,15,1500\n' +
- 'heap-js-ret-item,bar,baz;3\n' +
- 'heap-js-ret-item,baz,bar;3\n'
-];
-
-
-/**
- * @constructor
- */
-RemoteDebuggerCommandExecutorStub = function()
-{
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.DebuggerCommand = function(cmd)
-{
- if ('{"seq":2,"type":"request","command":"scripts","arguments":{"includeSource":false}}' === cmd) {
- var response1 =
- '{"seq":5,"request_seq":2,"type":"response","command":"scripts","' +
- 'success":true,"body":[{"handle":61,"type":"script","name":"' +
- 'http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
- '"lineCount":1,"sourceStart":"function fib(n) {","sourceLength":300,' +
- '"scriptType":2,"compilationType":0,"context":{"ref":60}}],"refs":[{' +
- '"handle":60,"type":"context","data":"page,3"}],"running":false}';
- this.sendResponse_(response1);
- } else if ('{"seq":3,"type":"request","command":"scripts","arguments":{"ids":[59],"includeSource":true}}' === cmd) {
- this.sendResponse_(
- '{"seq":8,"request_seq":3,"type":"response","command":"scripts",' +
- '"success":true,"body":[{"handle":1,"type":"script","name":' +
- '"http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
- '"lineCount":1,"source":"function fib(n) {return n+1;}",' +
- '"sourceLength":244,"scriptType":2,"compilationType":0,"context":{' +
- '"ref":0}}],"refs":[{"handle":0,"type":"context","data":"page,3}],"' +
- '"running":false}');
- } else if (cmd.indexOf('"command":"profile"') !== -1) {
- var cmdObj = JSON.parse(cmd);
- if (cmdObj.arguments.command === "resume")
- ProfilerStubHelper.GetInstance().StartProfiling(parseInt(cmdObj.arguments.modules));
- else if (cmdObj.arguments.command === "pause")
- ProfilerStubHelper.GetInstance().StopProfiling(parseInt(cmdObj.arguments.modules));
- else
- debugPrint("Unexpected profile command: " + cmdObj.arguments.command);
- } else
- debugPrint("Unexpected command: " + cmd);
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.DebuggerPauseScript = function()
-{
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.sendResponse_ = function(response)
-{
- setTimeout(function() {
- RemoteDebuggerAgent.debuggerOutput(response);
- }, 0);
-};
-
-
-DevToolsHostStub = function()
-{
- this.isStub = true;
-};
-DevToolsHostStub.prototype.__proto__ = WebInspector.InspectorFrontendHostStub.prototype;
-
-
-DevToolsHostStub.prototype.reset = function()
-{
-};
-
-
-DevToolsHostStub.prototype.setting = function()
-{
-};
-
-
-DevToolsHostStub.prototype.setSetting = function()
-{
-};
-
-
-window["RemoteDebuggerAgent"] = new RemoteDebuggerAgentStub();
-window["RemoteDebuggerCommandExecutor"] = new RemoteDebuggerCommandExecutorStub();
-window["RemoteProfilerAgent"] = new RemoteProfilerAgentStub();
-window["RemoteToolsAgent"] = new RemoteToolsAgentStub();
-InspectorFrontendHost = new DevToolsHostStub();
-
-}
diff --git a/WebKit/chromium/src/js/HeapProfilerPanel.js b/WebKit/chromium/src/js/HeapProfilerPanel.js
deleted file mode 100644
index abbf580..0000000
--- a/WebKit/chromium/src/js/HeapProfilerPanel.js
+++ /dev/null
@@ -1,966 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-/**
- * @fileoverview Heap profiler panel implementation.
- */
-
-WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) {
- snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number);
- snapshot.typeId = WebInspector.HeapSnapshotProfileType.TypeId;
-
- var snapshots = WebInspector.HeapSnapshotProfileType.snapshots;
- snapshots.push(snapshot);
-
- snapshot.listIndex = snapshots.length - 1;
-
- if (WebInspector.CPUProfile)
- this.addProfileHeader(WebInspector.HeapSnapshotProfileType.TypeId, snapshot);
- else
- this.addProfileHeader(snapshot);
-
- this.dispatchEventToListeners("snapshot added");
-}
-
-
-WebInspector.HeapSnapshotView = function(parent, profile)
-{
- WebInspector.View.call(this);
-
- this.element.addStyleClass("heap-snapshot-view");
-
- this.parent = parent;
- this.parent.addEventListener("snapshot added", this._updateBaseOptions, this);
-
- this.showCountAsPercent = false;
- this.showSizeAsPercent = false;
- this.showCountDeltaAsPercent = false;
- this.showSizeDeltaAsPercent = false;
-
- this.categories = {
- code: new WebInspector.ResourceCategory("code", WebInspector.UIString("Code"), "rgb(255,121,0)"),
- data: new WebInspector.ResourceCategory("data", WebInspector.UIString("Objects"), "rgb(47,102,236)")
- };
-
- var summaryContainer = document.createElement("div");
- summaryContainer.id = "heap-snapshot-summary-container";
-
- this.countsSummaryBar = new WebInspector.SummaryBar(this.categories);
- this.countsSummaryBar.element.className = "heap-snapshot-summary";
- this.countsSummaryBar.calculator = new WebInspector.HeapSummaryCountCalculator();
- var countsLabel = document.createElement("div");
- countsLabel.className = "heap-snapshot-summary-label";
- countsLabel.textContent = WebInspector.UIString("Count");
- this.countsSummaryBar.element.appendChild(countsLabel);
- summaryContainer.appendChild(this.countsSummaryBar.element);
-
- this.sizesSummaryBar = new WebInspector.SummaryBar(this.categories);
- this.sizesSummaryBar.element.className = "heap-snapshot-summary";
- this.sizesSummaryBar.calculator = new WebInspector.HeapSummarySizeCalculator();
- var sizesLabel = document.createElement("label");
- sizesLabel.className = "heap-snapshot-summary-label";
- sizesLabel.textContent = WebInspector.UIString("Size");
- this.sizesSummaryBar.element.appendChild(sizesLabel);
- summaryContainer.appendChild(this.sizesSummaryBar.element);
-
- this.element.appendChild(summaryContainer);
-
- var columns = { "cons": { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true },
- "count": { title: WebInspector.UIString("Count"), width: "54px", sortable: true },
- "size": { title: WebInspector.UIString("Size"), width: "72px", sort: "descending", sortable: true },
- "countDelta": { title: WebInspector.UIString("\xb1 Count"), width: "72px", sortable: true },
- "sizeDelta": { title: WebInspector.UIString("\xb1 Size"), width: "72px", sortable: true } };
-
- this.dataGrid = new WebInspector.DataGrid(columns);
- this.dataGrid.addEventListener("sorting changed", this._sortData, this);
- this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
- this.element.appendChild(this.dataGrid.element);
-
- this.profile = profile;
-
- this.baseSelectElement = document.createElement("select");
- this.baseSelectElement.className = "status-bar-item";
- this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false);
- this._updateBaseOptions();
- if (this.profile.listIndex > 0)
- this.baseSelectElement.selectedIndex = this.profile.listIndex - 1;
- else
- this.baseSelectElement.selectedIndex = this.profile.listIndex;
- this._resetDataGridList();
-
- this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item");
- this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
-
- this.refresh();
-
- this._updatePercentButton();
-};
-
-WebInspector.HeapSnapshotView.prototype = {
-
- get statusBarItems()
- {
- return [this.baseSelectElement, this.percentButton.element];
- },
-
- get profile()
- {
- return this._profile;
- },
-
- set profile(profile)
- {
- this._profile = profile;
- },
-
- show: function(parentElement)
- {
- WebInspector.View.prototype.show.call(this, parentElement);
- this.dataGrid.updateWidths();
- },
-
- hide: function()
- {
- WebInspector.View.prototype.hide.call(this);
- this._currentSearchResultIndex = -1;
- },
-
- resize: function()
- {
- if (this.dataGrid)
- this.dataGrid.updateWidths();
- },
-
- refresh: function()
- {
- this.dataGrid.removeChildren();
-
- var children = this.snapshotDataGridList.children;
- var count = children.length;
- for (var index = 0; index < count; ++index)
- this.dataGrid.appendChild(children[index]);
-
- this._updateSummaryGraph();
- },
-
- refreshShowAsPercents: function()
- {
- this._updatePercentButton();
- this.refreshVisibleData();
- },
-
- _deleteSearchMatchedFlags: function(node)
- {
- delete node._searchMatchedConsColumn;
- delete node._searchMatchedCountColumn;
- delete node._searchMatchedSizeColumn;
- delete node._searchMatchedCountDeltaColumn;
- delete node._searchMatchedSizeDeltaColumn;
- },
-
- searchCanceled: function()
- {
- if (this._searchResults) {
- for (var i = 0; i < this._searchResults.length; ++i) {
- var profileNode = this._searchResults[i].profileNode;
- this._deleteSearchMatchedFlags(profileNode);
- profileNode.refresh();
- }
- }
-
- delete this._searchFinishedCallback;
- this._currentSearchResultIndex = -1;
- this._searchResults = [];
- },
-
- performSearch: function(query, finishedCallback)
- {
- // Call searchCanceled since it will reset everything we need before doing a new search.
- this.searchCanceled();
-
- query = query.trimWhitespace();
-
- if (!query.length)
- return;
-
- this._searchFinishedCallback = finishedCallback;
-
- var helper = WebInspector.HeapSnapshotView.SearchHelper;
-
- var operationAndNumber = helper.parseOperationAndNumber(query);
- var operation = operationAndNumber[0];
- var queryNumber = operationAndNumber[1];
-
- var percentUnits = helper.percents.test(query);
- var megaBytesUnits = helper.megaBytes.test(query);
- var kiloBytesUnits = helper.kiloBytes.test(query);
- var bytesUnits = helper.bytes.test(query);
-
- var queryNumberBytes = (megaBytesUnits ? (queryNumber * 1024 * 1024) : (kiloBytesUnits ? (queryNumber * 1024) : queryNumber));
-
- function matchesQuery(heapSnapshotDataGridNode)
- {
- WebInspector.HeapSnapshotView.prototype._deleteSearchMatchedFlags(heapSnapshotDataGridNode);
-
- if (percentUnits) {
- heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.countPercent, queryNumber);
- heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.sizePercent, queryNumber);
- heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDeltaPercent, queryNumber);
- heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDeltaPercent, queryNumber);
- } else if (megaBytesUnits || kiloBytesUnits || bytesUnits) {
- heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.size, queryNumberBytes);
- heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDelta, queryNumberBytes);
- } else {
- heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.count, queryNumber);
- heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDelta, queryNumber);
- }
-
- if (heapSnapshotDataGridNode.constructorName.hasSubstring(query, true))
- heapSnapshotDataGridNode._searchMatchedConsColumn = true;
-
- if (heapSnapshotDataGridNode._searchMatchedConsColumn ||
- heapSnapshotDataGridNode._searchMatchedCountColumn ||
- heapSnapshotDataGridNode._searchMatchedSizeColumn ||
- heapSnapshotDataGridNode._searchMatchedCountDeltaColumn ||
- heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn) {
- heapSnapshotDataGridNode.refresh();
- return true;
- }
-
- return false;
- }
-
- var current = this.snapshotDataGridList.children[0];
- var depth = 0;
- var info = {};
-
- // The second and subsequent levels of heap snapshot nodes represent retainers,
- // so recursive expansion will be infinite, since a graph is being traversed.
- // So default to a recursion cap of 2 levels.
- var maxDepth = 2;
-
- while (current) {
- if (matchesQuery(current))
- this._searchResults.push({ profileNode: current });
- current = current.traverseNextNode(false, null, (depth >= maxDepth), info);
- depth += info.depthChange;
- }
-
- finishedCallback(this, this._searchResults.length);
- },
-
- jumpToFirstSearchResult: WebInspector.CPUProfileView.prototype.jumpToFirstSearchResult,
- jumpToLastSearchResult: WebInspector.CPUProfileView.prototype.jumpToLastSearchResult,
- jumpToNextSearchResult: WebInspector.CPUProfileView.prototype.jumpToNextSearchResult,
- jumpToPreviousSearchResult: WebInspector.CPUProfileView.prototype.jumpToPreviousSearchResult,
- showingFirstSearchResult: WebInspector.CPUProfileView.prototype.showingFirstSearchResult,
- showingLastSearchResult: WebInspector.CPUProfileView.prototype.showingLastSearchResult,
- _jumpToSearchResult: WebInspector.CPUProfileView.prototype._jumpToSearchResult,
-
- refreshVisibleData: function()
- {
- var child = this.dataGrid.children[0];
- while (child) {
- child.refresh();
- child = child.traverseNextNode(false, null, true);
- }
- this._updateSummaryGraph();
- },
-
- _changeBase: function() {
- if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex])
- return;
-
- this._resetDataGridList();
- this.refresh();
-
- if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
- return;
-
- // The current search needs to be performed again. First negate out previous match
- // count by calling the search finished callback with a negative number of matches.
- // Then perform the search again with the same query and callback.
- this._searchFinishedCallback(this, -this._searchResults.length);
- this.performSearch(this.currentQuery, this._searchFinishedCallback);
- },
-
- _createSnapshotDataGridList: function()
- {
- if (this._snapshotDataGridList)
- delete this._snapshotDataGridList;
-
- this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(this, this.baseSnapshot.entries, this.profile.entries);
- return this._snapshotDataGridList;
- },
-
- _mouseDownInDataGrid: function(event)
- {
- if (event.detail < 2)
- return;
-
- var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
- if (!cell || (!cell.hasStyleClass("count-column") && !cell.hasStyleClass("size-column") && !cell.hasStyleClass("countDelta-column") && !cell.hasStyleClass("sizeDelta-column")))
- return;
-
- if (cell.hasStyleClass("count-column"))
- this.showCountAsPercent = !this.showCountAsPercent;
- else if (cell.hasStyleClass("size-column"))
- this.showSizeAsPercent = !this.showSizeAsPercent;
- else if (cell.hasStyleClass("countDelta-column"))
- this.showCountDeltaAsPercent = !this.showCountDeltaAsPercent;
- else if (cell.hasStyleClass("sizeDelta-column"))
- this.showSizeDeltaAsPercent = !this.showSizeDeltaAsPercent;
-
- this.refreshShowAsPercents();
-
- event.preventDefault();
- event.stopPropagation();
- },
-
- get _isShowingAsPercent()
- {
- return this.showCountAsPercent && this.showSizeAsPercent && this.showCountDeltaAsPercent && this.showSizeDeltaAsPercent;
- },
-
- _percentClicked: function(event)
- {
- var currentState = this._isShowingAsPercent;
- this.showCountAsPercent = !currentState;
- this.showSizeAsPercent = !currentState;
- this.showCountDeltaAsPercent = !currentState;
- this.showSizeDeltaAsPercent = !currentState;
- this.refreshShowAsPercents();
- },
-
- _resetDataGridList: function()
- {
- this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex];
- var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyComparator("size", false);
- if (this.snapshotDataGridList)
- lastComparator = this.snapshotDataGridList.lastComparator;
- this.snapshotDataGridList = this._createSnapshotDataGridList();
- this.snapshotDataGridList.sort(lastComparator, true);
- },
-
- _sortData: function()
- {
- var sortAscending = this.dataGrid.sortOrder === "ascending";
- var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
- var sortProperty = {
- "cons": ["constructorName", null],
- "count": ["count", null],
- "size": ["size", "count"],
- "countDelta": this.showCountDeltaAsPercent ? ["countDeltaPercent", null] : ["countDelta", null],
- "sizeDelta": this.showSizeDeltaAsPercent ? ["sizeDeltaPercent", "countDeltaPercent"] : ["sizeDelta", "sizeDeltaPercent"]
- }[sortColumnIdentifier];
-
- this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.propertyComparator(sortProperty[0], sortProperty[1], sortAscending));
-
- this.refresh();
- },
-
- _updateBaseOptions: function()
- {
- var list = WebInspector.HeapSnapshotProfileType.snapshots;
- // We're assuming that snapshots can only be added.
- if (this.baseSelectElement.length === list.length)
- return;
-
- for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) {
- var baseOption = document.createElement("option");
- baseOption.label = WebInspector.UIString("Compared to %s", list[i].title);
- this.baseSelectElement.appendChild(baseOption);
- }
- },
-
- _updatePercentButton: function()
- {
- if (this._isShowingAsPercent) {
- this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes.");
- this.percentButton.toggled = true;
- } else {
- this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages.");
- this.percentButton.toggled = false;
- }
- },
-
- _updateSummaryGraph: function()
- {
- this.countsSummaryBar.calculator.showAsPercent = this._isShowingAsPercent;
- this.countsSummaryBar.update(this.profile.lowlevels);
-
- this.sizesSummaryBar.calculator.showAsPercent = this._isShowingAsPercent;
- this.sizesSummaryBar.update(this.profile.lowlevels);
- }
-};
-
-WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.HeapSnapshotView.SearchHelper = {
- // In comparators, we assume that a value from a node is passed as the first parameter.
- operations: { LESS: function (a, b) { return a !== null && a < b; },
- LESS_OR_EQUAL: function (a, b) { return a !== null && a <= b; },
- EQUAL: function (a, b) { return a !== null && a === b; },
- GREATER_OR_EQUAL: function (a, b) { return a !== null && a >= b; },
- GREATER: function (a, b) { return a !== null && a > b; } },
-
- operationParsers: { LESS: /^<(\d+)/,
- LESS_OR_EQUAL: /^<=(\d+)/,
- GREATER_OR_EQUAL: /^>=(\d+)/,
- GREATER: /^>(\d+)/ },
-
- parseOperationAndNumber: function(query)
- {
- var operations = WebInspector.HeapSnapshotView.SearchHelper.operations;
- var parsers = WebInspector.HeapSnapshotView.SearchHelper.operationParsers;
- for (var operation in parsers) {
- var match = query.match(parsers[operation]);
- if (match !== null)
- return [operations[operation], parseFloat(match[1])];
- }
- return [operations.EQUAL, parseFloat(query)];
- },
-
- percents: /%$/,
-
- megaBytes: /MB$/i,
-
- kiloBytes: /KB$/i,
-
- bytes: /B$/i
-}
-
-WebInspector.HeapSummaryCalculator = function(lowLevelField)
-{
- this.total = 1;
- this.lowLevelField = lowLevelField;
-}
-
-WebInspector.HeapSummaryCalculator.prototype = {
- computeSummaryValues: function(lowLevels)
- {
- var highLevels = {data: 0, code: 0};
- this.total = 0;
- for (var item in lowLevels) {
- var highItem = this._highFromLow(item);
- if (highItem) {
- var value = lowLevels[item][this.lowLevelField];
- highLevels[highItem] += value;
- this.total += value;
- }
- }
- var result = {categoryValues: highLevels};
- if (!this.showAsPercent)
- result.total = this.total;
- return result;
- },
-
- formatValue: function(value)
- {
- if (this.showAsPercent)
- return WebInspector.UIString("%.2f%%", value / this.total * 100.0);
- else
- return this._valueToString(value);
- },
-
- get showAsPercent()
- {
- return this._showAsPercent;
- },
-
- set showAsPercent(x)
- {
- this._showAsPercent = x;
- }
-}
-
-WebInspector.HeapSummaryCountCalculator = function()
-{
- WebInspector.HeapSummaryCalculator.call(this, "count");
-}
-
-WebInspector.HeapSummaryCountCalculator.prototype = {
- _highFromLow: function(type) {
- if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code";
- if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/)) return "data";
- return null;
- },
-
- _valueToString: function(value) {
- return value.toString();
- }
-}
-
-WebInspector.HeapSummaryCountCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype;
-
-WebInspector.HeapSummarySizeCalculator = function()
-{
- WebInspector.HeapSummaryCalculator.call(this, "size");
-}
-
-WebInspector.HeapSummarySizeCalculator.prototype = {
- _highFromLow: function(type) {
- if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code";
- if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/) || type.match(/_ARRAY_TYPE$/)) return "data";
- return null;
- },
-
- _valueToString: Number.bytesToString
-}
-
-WebInspector.HeapSummarySizeCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype;
-
-WebInspector.HeapSnapshotSidebarTreeElement = function(snapshot)
-{
- this.profile = snapshot;
-
- WebInspector.SidebarTreeElement.call(this, "heap-snapshot-sidebar-tree-item", "", "", snapshot, false);
-
- this.refreshTitles();
-};
-
-WebInspector.HeapSnapshotSidebarTreeElement.prototype = {
- get mainTitle()
- {
- if (this._mainTitle)
- return this._mainTitle;
- return this.profile.title;
- },
-
- set mainTitle(x)
- {
- this._mainTitle = x;
- this.refreshTitles();
- }
-};
-
-WebInspector.HeapSnapshotSidebarTreeElement.prototype.__proto__ = WebInspector.ProfileSidebarTreeElement.prototype;
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers = function(owningTree)
-{
- this.tree = owningTree;
-
- WebInspector.DataGridNode.call(this, null, this._hasRetainers);
-
- this.addEventListener("populate", this._populate, this);
-};
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype = {
- isEmptySet: function(set)
- {
- for (var x in set)
- return false;
- return true;
- },
-
- get _hasRetainers()
- {
- return !this.isEmptySet(this.retainers);
- },
-
- get _parent()
- {
- // For top-level nodes, return owning tree as a parent, not data grid.
- return this.parent !== this.dataGrid ? this.parent : this.tree;
- },
-
- _populate: function(event)
- {
- var self = this;
- this.produceDiff(this.baseRetainers, this.retainers, function(baseItem, snapshotItem) {
- self.appendChild(new WebInspector.HeapSnapshotDataGridRetainerNode(self.snapshotView, baseItem, snapshotItem, self.tree));
- });
-
- if (this._parent) {
- var currentComparator = this._parent.lastComparator;
- if (currentComparator)
- this.sort(currentComparator, true);
- }
-
- this.removeEventListener("populate", this._populate, this);
- },
-
- produceDiff: function(baseEntries, currentEntries, callback)
- {
- for (var item in currentEntries)
- callback(baseEntries[item], currentEntries[item]);
-
- for (item in baseEntries) {
- if (!(item in currentEntries))
- callback(baseEntries[item], null);
- }
- },
-
- sort: function(comparator, force) {
- if (!force && this.lastComparator === comparator)
- return;
-
- this.children.sort(comparator);
- var childCount = this.children.length;
- for (var childIndex = 0; childIndex < childCount; ++childIndex)
- this.children[childIndex]._recalculateSiblings(childIndex);
- for (var i = 0; i < this.children.length; ++i) {
- var child = this.children[i];
- if (!force && (!child.expanded || child.lastComparator === comparator))
- continue;
- child.sort(comparator, force);
- }
- this.lastComparator = comparator;
- },
-
- signForDelta: function(delta) {
- if (delta === 0)
- return "";
- if (delta > 0)
- return "+";
- else
- // Math minus sign, same width as plus.
- return "\u2212";
- },
-
- showDeltaAsPercent: function(value) {
- if (value === Number.POSITIVE_INFINITY)
- return WebInspector.UIString("new");
- else if (value === Number.NEGATIVE_INFINITY)
- return WebInspector.UIString("deleted");
- if (value > 1000.0)
- return WebInspector.UIString("%s >1000%%", this.signForDelta(value));
- return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.abs(value));
- },
-
- getTotalCount: function() {
- if (!this._count) {
- this._count = 0;
- for (var i = 0, n = this.children.length; i < n; ++i)
- this._count += this.children[i].count;
- }
- return this._count;
- },
-
- getTotalSize: function() {
- if (!this._size) {
- this._size = 0;
- for (var i = 0, n = this.children.length; i < n; ++i)
- this._size += this.children[i].size;
- }
- return this._size;
- },
-
- get countPercent()
- {
- return this.count / this._parent.getTotalCount() * 100.0;
- },
-
- get sizePercent()
- {
- return this.size / this._parent.getTotalSize() * 100.0;
- },
-
- get countDeltaPercent()
- {
- if (this.baseCount > 0) {
- if (this.count > 0)
- return this.countDelta / this.baseCount * 100.0;
- else
- return Number.NEGATIVE_INFINITY;
- } else
- return Number.POSITIVE_INFINITY;
- },
-
- get sizeDeltaPercent()
- {
- if (this.baseSize > 0) {
- if (this.size > 0)
- return this.sizeDelta / this.baseSize * 100.0;
- else
- return Number.NEGATIVE_INFINITY;
- } else
- return Number.POSITIVE_INFINITY;
- },
-
- get data()
- {
- var data = {};
-
- data["cons"] = this.constructorName;
-
- if (this.snapshotView.showCountAsPercent)
- data["count"] = WebInspector.UIString("%.2f%%", this.countPercent);
- else
- data["count"] = this.count;
-
- if (this.size !== null) {
- if (this.snapshotView.showSizeAsPercent)
- data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent);
- else
- data["size"] = Number.bytesToString(this.size);
- } else
- data["size"] = "";
-
- if (this.snapshotView.showCountDeltaAsPercent)
- data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent);
- else
- data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta(this.countDelta), Math.abs(this.countDelta));
-
- if (this.sizeDelta !== null) {
- if (this.snapshotView.showSizeDeltaAsPercent)
- data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercent);
- else
- data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDelta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta)));
- } else
- data["sizeDelta"] = "";
-
- return data;
- },
-
- createCell: function(columnIdentifier)
- {
- var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
-
- if ((columnIdentifier === "cons" && this._searchMatchedConsColumn) ||
- (columnIdentifier === "count" && this._searchMatchedCountColumn) ||
- (columnIdentifier === "size" && this._searchMatchedSizeColumn) ||
- (columnIdentifier === "countDelta" && this._searchMatchedCountDeltaColumn) ||
- (columnIdentifier === "sizeDelta" && this._searchMatchedSizeDeltaColumn))
- cell.addStyleClass("highlight");
-
- return cell;
- }
-};
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInspector.DataGridNode.prototype;
-
-WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
-{
- this.snapshotView = snapshotView;
-
- if (!snapshotEntry)
- snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {} };
- this.constructorName = snapshotEntry.cons;
- this.count = snapshotEntry.count;
- this.size = snapshotEntry.size;
- this.retainers = snapshotEntry.retainers;
-
- if (!baseEntry)
- baseEntry = { count: 0, size: 0, retainers: {} };
- this.baseCount = baseEntry.count;
- this.countDelta = this.count - this.baseCount;
- this.baseSize = baseEntry.size;
- this.sizeDelta = this.size - this.baseSize;
- this.baseRetainers = baseEntry.retainers;
-
- WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
-};
-
-WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
-
-WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snapshotEntries)
-{
- this.tree = this;
- this.snapshotView = snapshotView;
- this.children = [];
- this.lastComparator = null;
- this.populateChildren(baseEntries, snapshotEntries);
-};
-
-WebInspector.HeapSnapshotDataGridList.prototype = {
- appendChild: function(child)
- {
- this.insertChild(child, this.children.length);
- },
-
- insertChild: function(child, index)
- {
- this.children.splice(index, 0, child);
- },
-
- removeChildren: function()
- {
- this.children = [];
- },
-
- populateChildren: function(baseEntries, snapshotEntries)
- {
- var self = this;
- this.produceDiff(baseEntries, snapshotEntries, function(baseItem, snapshotItem) {
- self.appendChild(new WebInspector.HeapSnapshotDataGridNode(self.snapshotView, baseItem, snapshotItem, self));
- });
- },
-
- produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.produceDiff,
- sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort,
- getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalCount,
- getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalSize
-};
-
-WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}];
-
-WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, property2, isAscending)
-{
- var propertyHash = property + "#" + property2;
- var comparator = this.propertyComparators[(isAscending ? 1 : 0)][propertyHash];
- if (!comparator) {
- comparator = function(lhs, rhs) {
- var l = lhs[property], r = rhs[property];
- if ((l === null || r === null) && property2 !== null)
- l = lhs[property2], r = rhs[property2];
- var result = l < r ? -1 : (l > r ? 1 : 0);
- return isAscending ? result : -result;
- };
- this.propertyComparators[(isAscending ? 1 : 0)][propertyHash] = comparator;
- }
- return comparator;
-};
-
-WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
-{
- this.snapshotView = snapshotView;
-
- if (!snapshotEntry)
- snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} };
- this.constructorName = snapshotEntry.cons;
- this.count = snapshotEntry.count;
- this.retainers = this._calculateRetainers(this.snapshotView.profile, snapshotEntry.clusters);
-
- if (!baseEntry)
- baseEntry = { count: 0, clusters: {} };
- this.baseCount = baseEntry.count;
- this.countDelta = this.count - this.baseCount;
- this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot, baseEntry.clusters);
-
- this.size = null;
- this.sizeDelta = null;
-
- WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
-}
-
-WebInspector.HeapSnapshotDataGridRetainerNode.prototype = {
- get sizePercent()
- {
- return null;
- },
-
- get sizeDeltaPercent()
- {
- return null;
- },
-
- _calculateRetainers: function(snapshot, clusters) {
- var retainers = {};
- if (this.isEmptySet(clusters)) {
- if (this.constructorName in snapshot.entries)
- return snapshot.entries[this.constructorName].retainers;
- } else {
- // In case when an entry is retained by clusters, we need to gather up the list
- // of retainers by merging retainers of every cluster.
- // E.g. having such a tree:
- // A
- // Object:1 10
- // X 3
- // Y 4
- // Object:2 5
- // X 6
- //
- // will result in a following retainers list: X 9, Y 4.
- for (var clusterName in clusters) {
- if (clusterName in snapshot.clusters) {
- var clusterRetainers = snapshot.clusters[clusterName].retainers;
- for (var clusterRetainer in clusterRetainers) {
- var clusterRetainerEntry = clusterRetainers[clusterRetainer];
- if (!(clusterRetainer in retainers))
- retainers[clusterRetainer] = { cons: clusterRetainerEntry.cons, count: 0, clusters: {} };
- retainers[clusterRetainer].count += clusterRetainerEntry.count;
- for (var clusterRetainerCluster in clusterRetainerEntry.clusters)
- retainers[clusterRetainer].clusters[clusterRetainerCluster] = true;
- }
- }
- }
- }
- return retainers;
- }
-};
-
-WebInspector.HeapSnapshotDataGridRetainerNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
-
-
-WebInspector.HeapSnapshotProfileType = function()
-{
- WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS"));
-}
-
-WebInspector.HeapSnapshotProfileType.TypeId = "HEAP";
-
-WebInspector.HeapSnapshotProfileType.snapshots = [];
-
-WebInspector.HeapSnapshotProfileType.prototype = {
- get buttonTooltip()
- {
- return WebInspector.UIString("Take heap snapshot.");
- },
-
- get buttonStyle()
- {
- return "heap-snapshot-status-bar-item status-bar-item";
- },
-
- buttonClicked: function()
- {
- InspectorBackend.takeHeapSnapshot();
- },
-
- get welcomeMessage()
- {
- return WebInspector.UIString("Get a heap snapshot by pressing<br>the %s button on the status bar.");
- },
-
- createSidebarTreeElementForProfile: function(profile)
- {
- var element = new WebInspector.HeapSnapshotSidebarTreeElement(profile);
- element.small = false;
- return element;
- },
-
- createView: function(profile)
- {
- return new WebInspector.HeapSnapshotView(WebInspector.panels.profiles, profile);
- }
-}
-
-WebInspector.HeapSnapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
-
-
-(function() {
- var originalCreatePanels = WebInspector._createPanels;
- WebInspector._createPanels = function() {
- originalCreatePanels.apply(this, arguments);
- if (WebInspector.panels.profiles)
- WebInspector.panels.profiles.registerProfileType(new WebInspector.HeapSnapshotProfileType());
- }
-})();
diff --git a/WebKit/chromium/src/js/Images/segmentChromium.png b/WebKit/chromium/src/js/Images/segmentChromium.png
index 607559b..f4248e1 100755
--- a/WebKit/chromium/src/js/Images/segmentChromium.png
+++ b/WebKit/chromium/src/js/Images/segmentChromium.png
Binary files differ
diff --git a/WebKit/chromium/src/js/Images/statusbarBackgroundChromium.png b/WebKit/chromium/src/js/Images/statusbarBackgroundChromium.png
index 9d326ac..7a760c1 100755
--- a/WebKit/chromium/src/js/Images/statusbarBackgroundChromium.png
+++ b/WebKit/chromium/src/js/Images/statusbarBackgroundChromium.png
Binary files differ
diff --git a/WebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.png b/WebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.png
index 7c7db0a..e3bc944 100755
--- a/WebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.png
+++ b/WebKit/chromium/src/js/Images/statusbarBottomBackgroundChromium.png
Binary files differ
diff --git a/WebKit/chromium/src/js/Images/statusbarButtonsChromium.png b/WebKit/chromium/src/js/Images/statusbarButtonsChromium.png
index 0c6635d..136d5a8 100755
--- a/WebKit/chromium/src/js/Images/statusbarButtonsChromium.png
+++ b/WebKit/chromium/src/js/Images/statusbarButtonsChromium.png
Binary files differ
diff --git a/WebKit/chromium/src/js/Images/statusbarMenuButtonChromium.png b/WebKit/chromium/src/js/Images/statusbarMenuButtonChromium.png
index bf26684..5ff61d9 100755
--- a/WebKit/chromium/src/js/Images/statusbarMenuButtonChromium.png
+++ b/WebKit/chromium/src/js/Images/statusbarMenuButtonChromium.png
Binary files differ
diff --git a/WebKit/chromium/src/js/InjectDispatch.js b/WebKit/chromium/src/js/InjectDispatch.js
deleted file mode 100644
index e070c42..0000000
--- a/WebKit/chromium/src/js/InjectDispatch.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-/**
- * @fileoverview Injects "injected" object into the inspectable page.
- */
-
-
-var InspectorControllerDispatcher = {};
-
-/**
- * Main dispatch method, all calls from the host to InspectorController go
- * through this one.
- * @param {string} functionName Function to call
- * @param {string} json_args JSON-serialized call parameters.
- * @return {string} JSON-serialized result of the dispatched call.
- */
-InspectorControllerDispatcher.dispatch = function(functionName, json_args)
-{
- var params = JSON.parse(json_args);
- InspectorBackend[functionName].apply(InspectorBackend, params);
-};
-
-/**
- * Special controller object for APU related messages. Outgoing messages
- * are sent to this object if the ApuAgentDispatcher is enabled.
- **/
-var ApuAgentDispatcher = { enabled : false };
-
-/**
- * Dispatches messages to APU. This filters and transforms
- * outgoing messages that are used by APU.
- * @param {string} method name of the dispatch method.
- **/
-ApuAgentDispatcher.dispatchToApu = function(method, args)
-{
- if (method !== "addRecordToTimeline" && method !== "updateResource" && method !== "addResource")
- return;
- // TODO(knorton): Transform args so they can be used
- // by APU.
- DevToolsAgentHost.dispatchToApu(JSON.stringify(args));
-};
-
-/**
- * This is called by the InspectorFrontend for serialization.
- * We serialize the call and send it to the client over the IPC
- * using dispatchOut bound method.
- */
-function dispatch(method, var_args) {
- // Handle all messages with non-primitieve arguments here.
- var args = Array.prototype.slice.call(arguments);
-
- if (method === "inspectedWindowCleared" || method === "reset" || method === "setAttachedWindow") {
- // Filter out messages we don't need here.
- // We do it on the sender side since they may have non-serializable
- // parameters.
- return;
- }
-
- // Sniff some inspector controller state changes in order to support
- // cross-navigation instrumentation. Keep names in sync with
- // webdevtoolsagent_impl.
- if (method === "timelineProfilerWasStarted")
- DevToolsAgentHost.runtimeFeatureStateChanged("timeline-profiler", true);
- else if (method === "timelineProfilerWasStopped")
- DevToolsAgentHost.runtimeFeatureStateChanged("timeline-profiler", false);
- else if (method === "resourceTrackingWasEnabled")
- DevToolsAgentHost.runtimeFeatureStateChanged("resource-tracking", true);
- else if (method === "resourceTrackingWasDisabled")
- DevToolsAgentHost.runtimeFeatureStateChanged("resource-tracking", false);
-
- if (ApuAgentDispatcher.enabled) {
- ApuAgentDispatcher.dispatchToApu(method, args);
- return;
- }
-
- var call = JSON.stringify(args);
- DevToolsAgentHost.dispatch(call);
-};
diff --git a/WebKit/chromium/src/js/InspectorControllerImpl.js b/WebKit/chromium/src/js/InspectorControllerImpl.js
deleted file mode 100644
index c92a94c..0000000
--- a/WebKit/chromium/src/js/InspectorControllerImpl.js
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-/**
- * @fileoverview DevTools' implementation of the InspectorController API.
- */
-
-if (!this.devtools)
- devtools = {};
-
-devtools.InspectorBackendImpl = function()
-{
- WebInspector.InspectorBackendStub.call(this);
- this.installInspectorControllerDelegate_("clearMessages");
- this.installInspectorControllerDelegate_("copyNode");
- this.installInspectorControllerDelegate_("deleteCookie");
- this.installInspectorControllerDelegate_("didEvaluateForTestInFrontend");
- this.installInspectorControllerDelegate_("disableResourceTracking");
- this.installInspectorControllerDelegate_("disableTimeline");
- this.installInspectorControllerDelegate_("enableResourceTracking");
- this.installInspectorControllerDelegate_("enableTimeline");
- this.installInspectorControllerDelegate_("getChildNodes");
- this.installInspectorControllerDelegate_("getCookies");
- this.installInspectorControllerDelegate_("getDatabaseTableNames");
- this.installInspectorControllerDelegate_("getDOMStorageEntries");
- this.installInspectorControllerDelegate_("getEventListenersForNode");
- this.installInspectorControllerDelegate_("getResourceContent");
- this.installInspectorControllerDelegate_("highlightDOMNode");
- this.installInspectorControllerDelegate_("hideDOMNodeHighlight");
- this.installInspectorControllerDelegate_("releaseWrapperObjectGroup");
- this.installInspectorControllerDelegate_("removeAttribute");
- this.installInspectorControllerDelegate_("removeDOMStorageItem");
- this.installInspectorControllerDelegate_("removeNode");
- this.installInspectorControllerDelegate_("saveFrontendSettings");
- this.installInspectorControllerDelegate_("setAttribute");
- this.installInspectorControllerDelegate_("setDOMStorageItem");
- this.installInspectorControllerDelegate_("setInjectedScriptSource");
- this.installInspectorControllerDelegate_("setTextNodeValue");
- this.installInspectorControllerDelegate_("startTimelineProfiler");
- this.installInspectorControllerDelegate_("stopTimelineProfiler");
- this.installInspectorControllerDelegate_("storeLastActivePanel");
-};
-devtools.InspectorBackendImpl.prototype.__proto__ = WebInspector.InspectorBackendStub.prototype;
-
-
-/**
- * {@inheritDoc}.
- */
-devtools.InspectorBackendImpl.prototype.toggleNodeSearch = function()
-{
- WebInspector.InspectorBackendStub.prototype.toggleNodeSearch.call(this);
- this.callInspectorController_.call(this, "toggleNodeSearch");
- if (!this.searchingForNode()) {
- // This is called from ElementsPanel treeOutline's focusNodeChanged().
- DevToolsHost.activateWindow();
- }
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.debuggerEnabled = function()
-{
- return true;
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.profilerEnabled = function()
-{
- return true;
-};
-
-
-devtools.InspectorBackendImpl.prototype.addBreakpoint = function(sourceID, line, condition)
-{
- devtools.tools.getDebuggerAgent().addBreakpoint(sourceID, line, condition);
-};
-
-
-devtools.InspectorBackendImpl.prototype.removeBreakpoint = function(sourceID, line)
-{
- devtools.tools.getDebuggerAgent().removeBreakpoint(sourceID, line);
-};
-
-devtools.InspectorBackendImpl.prototype.updateBreakpoint = function(sourceID, line, condition)
-{
- devtools.tools.getDebuggerAgent().updateBreakpoint(sourceID, line, condition);
-};
-
-devtools.InspectorBackendImpl.prototype.pauseInDebugger = function()
-{
- devtools.tools.getDebuggerAgent().pauseExecution();
-};
-
-
-devtools.InspectorBackendImpl.prototype.resumeDebugger = function()
-{
- devtools.tools.getDebuggerAgent().resumeExecution();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepIntoStatementInDebugger = function()
-{
- devtools.tools.getDebuggerAgent().stepIntoStatement();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepOutOfFunctionInDebugger = function()
-{
- devtools.tools.getDebuggerAgent().stepOutOfFunction();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepOverStatementInDebugger = function()
-{
- devtools.tools.getDebuggerAgent().stepOverStatement();
-};
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.setPauseOnExceptionsState = function(state)
-{
- this._setPauseOnExceptionsState = state;
- // TODO(yurys): support all three states. See http://crbug.com/32877
- var enabled = (state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions);
- return devtools.tools.getDebuggerAgent().setPauseOnExceptions(enabled);
-};
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.pauseOnExceptionsState = function()
-{
- return (this._setPauseOnExceptionsState || WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions);
-};
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.pauseOnExceptions = function()
-{
- return devtools.tools.getDebuggerAgent().pauseOnExceptions();
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.setPauseOnExceptions = function(value)
-{
- return devtools.tools.getDebuggerAgent().setPauseOnExceptions(value);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.startProfiling = function()
-{
- devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.stopProfiling = function()
-{
- devtools.tools.getProfilerAgent().stopProfiling( devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.getProfileHeaders = function(callId)
-{
- WebInspector.didGetProfileHeaders(callId, []);
-};
-
-
-/**
- * Emulate WebKit InspectorController behavior. It stores profiles on renderer side,
- * and is able to retrieve them by uid using "getProfile".
- */
-devtools.InspectorBackendImpl.prototype.addFullProfile = function(profile)
-{
- WebInspector.__fullProfiles = WebInspector.__fullProfiles || {};
- WebInspector.__fullProfiles[profile.uid] = profile;
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.getProfile = function(callId, uid)
-{
- if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles))
- WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.takeHeapSnapshot = function()
-{
- devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT
- | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_STATS
- | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_JS_CONSTRUCTORS);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.dispatchOnInjectedScript = function(callId, injectedScriptId, methodName, argsString, async)
-{
- // Encode injectedScriptId into callId
- if (typeof injectedScriptId !== "number")
- injectedScriptId = 0;
- RemoteToolsAgent.dispatchOnInjectedScript(callId, injectedScriptId, methodName, argsString, async);
-};
-
-
-/**
- * Installs delegating handler into the inspector controller.
- * @param {string} methodName Method to install delegating handler for.
- */
-devtools.InspectorBackendImpl.prototype.installInspectorControllerDelegate_ = function(methodName)
-{
- this[methodName] = this.callInspectorController_.bind(this, methodName);
-};
-
-
-/**
- * Bound function with the installInjectedScriptDelegate_ actual
- * implementation.
- */
-devtools.InspectorBackendImpl.prototype.callInspectorController_ = function(methodName, var_arg)
-{
- var args = Array.prototype.slice.call(arguments, 1);
- RemoteToolsAgent.dispatchOnInspectorController(WebInspector.Callback.wrap(function(){}), methodName, JSON.stringify(args));
-};
-
-
-InspectorBackend = new devtools.InspectorBackendImpl();
diff --git a/WebKit/chromium/src/js/ProfilerAgent.js b/WebKit/chromium/src/js/ProfilerAgent.js
deleted file mode 100644
index e08c5d2..0000000
--- a/WebKit/chromium/src/js/ProfilerAgent.js
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-/**
- * @fileoverview Provides communication interface to remote v8 profiler.
- */
-
-/**
- * @constructor
- */
-devtools.ProfilerAgent = function()
-{
- RemoteProfilerAgent.didGetActiveProfilerModules = this._didGetActiveProfilerModules.bind(this);
- RemoteProfilerAgent.didGetLogLines = this._didGetLogLines.bind(this);
-
- /**
- * Active profiler modules flags.
- * @type {number}
- */
- this._activeProfilerModules = devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
-
- /**
- * Interval for polling profiler state.
- * @type {number}
- */
- this._getActiveProfilerModulesInterval = null;
-
- /**
- * Profiler log position.
- * @type {number}
- */
- this._logPosition = 0;
-
- /**
- * Last requested log position.
- * @type {number}
- */
- this._lastRequestedLogPosition = -1;
-
- /**
- * Whether log contents retrieval must be forced next time.
- * @type {boolean}
- */
- this._forceGetLogLines = false;
-
- /**
- * Profiler processor instance.
- * @type {devtools.profiler.Processor}
- */
- this._profilerProcessor = new devtools.profiler.Processor();
-};
-
-
-/**
- * A copy of enum from include/v8.h
- * @enum {number}
- */
-devtools.ProfilerAgent.ProfilerModules = {
- PROFILER_MODULE_NONE: 0,
- PROFILER_MODULE_CPU: 1,
- PROFILER_MODULE_HEAP_STATS: 1 << 1,
- PROFILER_MODULE_JS_CONSTRUCTORS: 1 << 2,
- PROFILER_MODULE_HEAP_SNAPSHOT: 1 << 16
-};
-
-
-/**
- * Sets up callbacks that deal with profiles processing.
- */
-devtools.ProfilerAgent.prototype.setupProfilerProcessorCallbacks = function()
-{
- // A temporary icon indicating that the profile is being processed.
- var processingIcon = new WebInspector.SidebarTreeElement(
- "profile-sidebar-tree-item",
- WebInspector.UIString("Processing..."),
- '', null, false);
- var profilesSidebar = WebInspector.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).treeElement;
-
- this._profilerProcessor.setCallbacks(
- function onProfileProcessingStarted() {
- // Set visually empty string. Subtitle hiding is done via styles
- // manipulation which doesn't play well with dynamic append / removal.
- processingIcon.subtitle = " ";
- profilesSidebar.appendChild(processingIcon);
- },
- function onProfileProcessingStatus(ticksCount) {
- processingIcon.subtitle = WebInspector.UIString("%d ticks processed", ticksCount);
- },
- function onProfileProcessingFinished(profile) {
- profilesSidebar.removeChild(processingIcon);
- profile.typeId = WebInspector.CPUProfileType.TypeId;
- InspectorBackend.addFullProfile(profile);
- WebInspector.addProfileHeader(profile);
- // If no profile is currently shown, show the new one.
- var profilesPanel = WebInspector.panels.profiles;
- if (!profilesPanel.visibleView) {
- profilesPanel.showProfile(profile);
- }
- }
- );
-};
-
-
-/**
- * Initializes profiling state.
- */
-devtools.ProfilerAgent.prototype.initializeProfiling = function()
-{
- this.setupProfilerProcessorCallbacks();
- this._forceGetLogLines = true;
- this._getActiveProfilerModulesInterval = setInterval(function() { RemoteProfilerAgent.getActiveProfilerModules(); }, 1000);
-};
-
-
-/**
- * Requests the next chunk of log lines.
- * @param {boolean} immediately Do not postpone the request.
- * @private
- */
-devtools.ProfilerAgent.prototype._getNextLogLines = function(immediately)
-{
- if (this._lastRequestedLogPosition == this._logPosition)
- return;
- var pos = this._lastRequestedLogPosition = this._logPosition;
- if (immediately)
- RemoteProfilerAgent.getLogLines(pos);
- else
- setTimeout(function() { RemoteProfilerAgent.getLogLines(pos); }, 500);
-};
-
-
-/**
- * Starts profiling.
- * @param {number} modules List of modules to enable.
- */
-devtools.ProfilerAgent.prototype.startProfiling = function(modules)
-{
- var cmd = new devtools.DebugCommand("profile", {
- "modules": modules,
- "command": "resume"});
- devtools.DebuggerAgent.sendCommand_(cmd);
- RemoteDebuggerAgent.processDebugCommands();
- if (modules & devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
- // Active modules will not change, instead, a snapshot will be logged.
- this._getNextLogLines();
- }
-};
-
-
-/**
- * Stops profiling.
- */
-devtools.ProfilerAgent.prototype.stopProfiling = function(modules)
-{
- var cmd = new devtools.DebugCommand("profile", {
- "modules": modules,
- "command": "pause"});
- devtools.DebuggerAgent.sendCommand_(cmd);
- RemoteDebuggerAgent.processDebugCommands();
-};
-
-
-/**
- * Handles current profiler status.
- * @param {number} modules List of active (started) modules.
- */
-devtools.ProfilerAgent.prototype._didGetActiveProfilerModules = function(modules)
-{
- var profModules = devtools.ProfilerAgent.ProfilerModules;
- var profModuleNone = profModules.PROFILER_MODULE_NONE;
- if (this._forceGetLogLines || (modules !== profModuleNone && this._activeProfilerModules === profModuleNone)) {
- this._forceGetLogLines = false;
- // Start to query log data.
- this._getNextLogLines(true);
- }
- this._activeProfilerModules = modules;
- // Update buttons.
- WebInspector.setRecordingProfile(modules & profModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * Handles a portion of a profiler log retrieved by getLogLines call.
- * @param {number} pos Current position in log.
- * @param {string} log A portion of profiler log.
- */
-devtools.ProfilerAgent.prototype._didGetLogLines = function(pos, log)
-{
- this._logPosition = pos;
- if (log.length > 0)
- this._profilerProcessor.processLogChunk(log);
- else {
- // Allow re-reading from the last position.
- this._lastRequestedLogPosition = this._logPosition - 1;
- if (this._activeProfilerModules === devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE)
- // No new data and profiling is stopped---suspend log reading.
- return;
- }
- this._getNextLogLines();
-};
diff --git a/WebKit/chromium/src/js/ProfilerProcessor.js b/WebKit/chromium/src/js/ProfilerProcessor.js
deleted file mode 100644
index f678d2c..0000000
--- a/WebKit/chromium/src/js/ProfilerProcessor.js
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
-
-/**
- * @fileoverview Profiler processor is used to process log file produced
- * by V8 and produce an internal profile representation which is used
- * for building profile views in "Profiles" tab.
- */
-
-
-/**
- * Creates a Profile View builder object compatible with WebKit Profiler UI.
- *
- * @param {number} samplingRate Number of ms between profiler ticks.
- * @constructor
- */
-devtools.profiler.WebKitViewBuilder = function(samplingRate)
-{
- devtools.profiler.ViewBuilder.call(this, samplingRate);
-};
-devtools.profiler.WebKitViewBuilder.prototype.__proto__ = devtools.profiler.ViewBuilder.prototype;
-
-
-/**
- * @override
- */
-devtools.profiler.WebKitViewBuilder.prototype.createViewNode = function(funcName, totalTime, selfTime, head)
-{
- return new devtools.profiler.WebKitViewNode(funcName, totalTime, selfTime, head);
-};
-
-
-/**
- * Constructs a Profile View node object for displaying in WebKit Profiler UI.
- *
- * @param {string} internalFuncName A fully qualified function name.
- * @param {number} totalTime Amount of time that application spent in the
- * corresponding function and its descendants (not that depending on
- * profile they can be either callees or callers.)
- * @param {number} selfTime Amount of time that application spent in the
- * corresponding function only.
- * @param {devtools.profiler.ProfileView.Node} head Profile view head.
- * @constructor
- */
-devtools.profiler.WebKitViewNode = function(internalFuncName, totalTime, selfTime, head)
-{
- devtools.profiler.ProfileView.Node.call(this, internalFuncName, totalTime, selfTime, head);
- this.initFuncInfo_();
- this.callUID = internalFuncName;
-};
-devtools.profiler.WebKitViewNode.prototype.__proto__ = devtools.profiler.ProfileView.Node.prototype;
-
-
-/**
- * RegEx for stripping V8's prefixes of compiled functions.
- */
-devtools.profiler.WebKitViewNode.FUNC_NAME_STRIP_RE = /^(?:LazyCompile|Function|Callback): (.*)$/;
-
-
-/**
- * RegEx for extracting script source URL and line number.
- */
-devtools.profiler.WebKitViewNode.FUNC_NAME_PARSE_RE = /^((?:get | set )?[^ ]+) (.*):(\d+)( \{\d+\})?$/;
-
-
-/**
- * Inits "functionName", "url", and "lineNumber" fields using "internalFuncName"
- * field.
- * @private
- */
-devtools.profiler.WebKitViewNode.prototype.initFuncInfo_ = function()
-{
- var nodeAlias = devtools.profiler.WebKitViewNode;
- this.functionName = this.internalFuncName;
-
- var strippedName = nodeAlias.FUNC_NAME_STRIP_RE.exec(this.functionName);
- if (strippedName)
- this.functionName = strippedName[1];
-
- var parsedName = nodeAlias.FUNC_NAME_PARSE_RE.exec(this.functionName);
- if (parsedName) {
- this.functionName = parsedName[1];
- if (parsedName[4])
- this.functionName += parsedName[4];
- this.url = parsedName[2];
- this.lineNumber = parsedName[3];
- } else {
- this.url = '';
- this.lineNumber = 0;
- }
-};
-
-
-/**
- * Ancestor of a profile object that leaves out only JS-related functions.
- * @constructor
- */
-devtools.profiler.JsProfile = function()
-{
- devtools.profiler.Profile.call(this);
-};
-devtools.profiler.JsProfile.prototype.__proto__ = devtools.profiler.Profile.prototype;
-
-
-/**
- * RegExp that leaves only non-native JS functions.
- * @type {RegExp}
- */
-devtools.profiler.JsProfile.JS_NON_NATIVE_RE = new RegExp(
- "^" +
- "(?:Callback:)|" +
- "(?:Script: (?!native))|" +
- "(?:(?:LazyCompile|Function): [^ ]*(?: (?!native )[^ ]+:\\d+)?$)");
-
-
-/**
- * @override
- */
-devtools.profiler.JsProfile.prototype.skipThisFunction = function(name)
-{
- return !devtools.profiler.JsProfile.JS_NON_NATIVE_RE.test(name);
-};
-
-
-/**
- * Profiler processor. Consumes profiler log and builds profile views.
- * FIXME: change field naming style to use trailing underscore.
- *
- * @param {function(devtools.profiler.ProfileView)} newProfileCallback Callback
- * that receives a new processed profile.
- * @constructor
- */
-devtools.profiler.Processor = function()
-{
- var dispatches = {
- "code-creation": {
- parsers: [null, this.createAddressParser("code"), parseInt, null],
- processor: this.processCodeCreation_, backrefs: true,
- needsProfile: true },
- "code-move": { parsers: [this.createAddressParser("code"),
- this.createAddressParser("code-move-to")],
- processor: this.processCodeMove_, backrefs: true,
- needsProfile: true },
- "code-delete": { parsers: [this.createAddressParser("code")],
- processor: this.processCodeDelete_, backrefs: true,
- needsProfile: true },
- "function-creation": { parsers: [this.createAddressParser("code"),
- this.createAddressParser("function-obj")],
- processor: this.processFunctionCreation_, backrefs: true },
- "function-move": { parsers: [this.createAddressParser("code"),
- this.createAddressParser("code-move-to")],
- processor: this.processFunctionMove_, backrefs: true },
- "function-delete": { parsers: [this.createAddressParser("code")],
- processor: this.processFunctionDelete_, backrefs: true },
- "tick": { parsers: [this.createAddressParser("code"),
- this.createAddressParser("stack"), parseInt, "var-args"],
- processor: this.processTick_, backrefs: true, needProfile: true },
- "profiler": { parsers: [null, "var-args"],
- processor: this.processProfiler_, needsProfile: false },
- "heap-sample-begin": { parsers: [null, null, parseInt],
- processor: this.processHeapSampleBegin_ },
- "heap-sample-stats": { parsers: [null, null, parseInt, parseInt],
- processor: this.processHeapSampleStats_ },
- "heap-sample-item": { parsers: [null, parseInt, parseInt],
- processor: this.processHeapSampleItem_ },
- "heap-js-cons-item": { parsers: [null, parseInt, parseInt],
- processor: this.processHeapJsConsItem_ },
- "heap-js-ret-item": { parsers: [null, "var-args"],
- processor: this.processHeapJsRetItem_ },
- "heap-sample-end": { parsers: [null, null],
- processor: this.processHeapSampleEnd_ },
- // Not used in DevTools Profiler.
- "shared-library": null,
- // Obsolete row types.
- "code-allocate": null,
- "begin-code-region": null,
- "end-code-region": null};
-
- if (devtools.profiler.Profile.VERSION === 2) {
- dispatches["tick"] = { parsers: [this.createAddressParser("code"),
- this.createAddressParser("stack"),
- this.createAddressParser("func"), parseInt, "var-args"],
- processor: this.processTickV2_, backrefs: true };
- }
-
- devtools.profiler.LogReader.call(this, dispatches);
-
- /**
- * Callback that is called when a new profile is encountered in the log.
- * @type {function()}
- */
- this.startedProfileProcessing_ = null;
-
- /**
- * Callback that is called periodically to display processing status.
- * @type {function()}
- */
- this.profileProcessingStatus_ = null;
-
- /**
- * Callback that is called when a profile has been processed and is ready
- * to be shown.
- * @type {function(devtools.profiler.ProfileView)}
- */
- this.finishedProfileProcessing_ = null;
-
- /**
- * The current profile.
- * @type {devtools.profiler.JsProfile}
- */
- this.currentProfile_ = null;
-
- /**
- * Builder of profile views. Created during "profiler,begin" event processing.
- * @type {devtools.profiler.WebKitViewBuilder}
- */
- this.viewBuilder_ = null;
-
- /**
- * Next profile id.
- * @type {number}
- */
- this.profileId_ = 1;
-
- /**
- * Counter for processed ticks.
- * @type {number}
- */
- this.ticksCount_ = 0;
-
- /**
- * Interval id for updating processing status.
- * @type {number}
- */
- this.processingInterval_ = null;
-
- /**
- * The current heap snapshot.
- * @type {string}
- */
- this.currentHeapSnapshot_ = null;
-
- /**
- * Next heap snapshot id.
- * @type {number}
- */
- this.heapSnapshotId_ = 1;
-};
-devtools.profiler.Processor.prototype.__proto__ = devtools.profiler.LogReader.prototype;
-
-
-/**
- * @override
- */
-devtools.profiler.Processor.prototype.printError = function(str)
-{
- debugPrint(str);
-};
-
-
-/**
- * @override
- */
-devtools.profiler.Processor.prototype.skipDispatch = function(dispatch)
-{
- return dispatch.needsProfile && this.currentProfile_ === null;
-};
-
-
-/**
- * Sets profile processing callbacks.
- *
- * @param {function()} started Started processing callback.
- * @param {function(devtools.profiler.ProfileView)} finished Finished
- * processing callback.
- */
-devtools.profiler.Processor.prototype.setCallbacks = function(started, processing, finished)
-{
- this.startedProfileProcessing_ = started;
- this.profileProcessingStatus_ = processing;
- this.finishedProfileProcessing_ = finished;
-};
-
-
-/**
- * An address for the fake "(program)" entry. WebKit's visualisation
- * has assumptions on how the top of the call tree should look like,
- * and we need to add a fake entry as the topmost function. This
- * address is chosen because it's the end address of the first memory
- * page, which is never used for code or data, but only as a guard
- * page for catching AV errors.
- *
- * @type {number}
- */
-devtools.profiler.Processor.PROGRAM_ENTRY = 0xffff;
-/**
- * @type {string}
- */
-devtools.profiler.Processor.PROGRAM_ENTRY_STR = "0xffff";
-
-
-/**
- * Sets new profile callback.
- * @param {function(devtools.profiler.ProfileView)} callback Callback function.
- */
-devtools.profiler.Processor.prototype.setNewProfileCallback = function(callback)
-{
- this.newProfileCallback_ = callback;
-};
-
-
-devtools.profiler.Processor.prototype.processProfiler_ = function(state, params)
-{
- switch (state) {
- case "resume":
- if (this.currentProfile_ === null) {
- this.currentProfile_ = new devtools.profiler.JsProfile();
- // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
- this.currentProfile_.addCode("Function", "(program)", devtools.profiler.Processor.PROGRAM_ENTRY, 1);
- if (this.startedProfileProcessing_)
- this.startedProfileProcessing_();
- this.ticksCount_ = 0;
- var self = this;
- if (this.profileProcessingStatus_) {
- this.processingInterval_ = window.setInterval(
- function() { self.profileProcessingStatus_(self.ticksCount_); },
- 1000);
- }
- }
- break;
- case "pause":
- if (this.currentProfile_ !== null) {
- window.clearInterval(this.processingInterval_);
- this.processingInterval_ = null;
- if (this.finishedProfileProcessing_)
- this.finishedProfileProcessing_(this.createProfileForView());
- this.currentProfile_ = null;
- }
- break;
- case "begin":
- var samplingRate = NaN;
- if (params.length > 0)
- samplingRate = parseInt(params[0]);
- if (isNaN(samplingRate))
- samplingRate = 1;
- this.viewBuilder_ = new devtools.profiler.WebKitViewBuilder(samplingRate);
- break;
- // These events are valid but aren't used.
- case "compression":
- case "end": break;
- default:
- throw new Error("unknown profiler state: " + state);
- }
-};
-
-
-devtools.profiler.Processor.prototype.processCodeCreation_ = function(type, start, size, name)
-{
- this.currentProfile_.addCode(this.expandAlias(type), name, start, size);
-};
-
-
-devtools.profiler.Processor.prototype.processCodeMove_ = function(from, to)
-{
- this.currentProfile_.moveCode(from, to);
-};
-
-
-devtools.profiler.Processor.prototype.processCodeDelete_ = function(start)
-{
- this.currentProfile_.deleteCode(start);
-};
-
-
-devtools.profiler.Processor.prototype.processFunctionCreation_ = function(functionAddr, codeAddr)
-{
- this.currentProfile_.addCodeAlias(functionAddr, codeAddr);
-};
-
-
-devtools.profiler.Processor.prototype.processFunctionMove_ = function(from, to)
-{
- this.currentProfile_.safeMoveDynamicCode(from, to);
-};
-
-
-devtools.profiler.Processor.prototype.processFunctionDelete_ = function(start)
-{
- this.currentProfile_.safeDeleteDynamicCode(start);
-};
-
-
-// TODO(mnaganov): Remove after next V8 roll.
-devtools.profiler.Processor.prototype.processTick_ = function(pc, sp, vmState, stack)
-{
- // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
- stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR);
- this.currentProfile_.recordTick(this.processStack(pc, stack));
- this.ticksCount_++;
-};
-
-
-devtools.profiler.Processor.prototype.processTickV2_ = function(pc, sp, func, vmState, stack)
-{
- // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
- stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR);
-
-
- if (func) {
- var funcEntry = this.currentProfile_.findEntry(func);
- if (!funcEntry || !funcEntry.isJSFunction || !funcEntry.isJSFunction())
- func = 0;
- else {
- var currEntry = this.currentProfile_.findEntry(pc);
- if (!currEntry || !currEntry.isJSFunction || currEntry.isJSFunction()) {
- func = 0;
- }
- }
- }
-
- this.currentProfile_.recordTick(this.processStack(pc, func, stack));
- this.ticksCount_++;
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleBegin_ = function(space, state, ticks)
-{
- if (space !== "Heap") return;
- this.currentHeapSnapshot_ = {
- number: this.heapSnapshotId_++,
- entries: {},
- clusters: {},
- lowlevels: {},
- ticks: ticks
- };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleStats_ = function(space, state, capacity, used)
-{
- if (space !== "Heap") return;
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleItem_ = function(item, number, size)
-{
- if (!this.currentHeapSnapshot_) return;
- this.currentHeapSnapshot_.lowlevels[item] = {
- type: item, count: number, size: size
- };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapJsConsItem_ = function(item, number, size)
-{
- if (!this.currentHeapSnapshot_) return;
- this.currentHeapSnapshot_.entries[item] = {
- cons: item, count: number, size: size, retainers: {}
- };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapJsRetItem_ = function(item, retainersArray)
-{
- if (!this.currentHeapSnapshot_) return;
- var rawRetainers = {};
- for (var i = 0, n = retainersArray.length; i < n; ++i) {
- var entry = retainersArray[i].split(";");
- rawRetainers[entry[0]] = parseInt(entry[1], 10);
- }
-
- function mergeRetainers(entry) {
- for (var rawRetainer in rawRetainers) {
- var consName = rawRetainer.indexOf(":") !== -1 ? rawRetainer.split(":")[0] : rawRetainer;
- if (!(consName in entry.retainers))
- entry.retainers[consName] = { cons: consName, count: 0, clusters: {} };
- var retainer = entry.retainers[consName];
- retainer.count += rawRetainers[rawRetainer];
- if (consName !== rawRetainer)
- retainer.clusters[rawRetainer] = true;
- }
- }
-
- if (item.indexOf(":") !== -1) {
- // Array, Function, or Object instances cluster case.
- if (!(item in this.currentHeapSnapshot_.clusters)) {
- this.currentHeapSnapshot_.clusters[item] = {
- cons: item, retainers: {}
- };
- }
- mergeRetainers(this.currentHeapSnapshot_.clusters[item]);
- item = item.split(":")[0];
- }
- mergeRetainers(this.currentHeapSnapshot_.entries[item]);
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleEnd_ = function(space, state)
-{
- if (space !== "Heap") return;
- var snapshot = this.currentHeapSnapshot_;
- this.currentHeapSnapshot_ = null;
- WebInspector.panels.profiles.addSnapshot(snapshot);
-};
-
-
-/**
- * Creates a profile for further displaying in ProfileView.
- */
-devtools.profiler.Processor.prototype.createProfileForView = function()
-{
- var profile = this.viewBuilder_.buildView(this.currentProfile_.getTopDownProfile());
- profile.uid = this.profileId_++;
- profile.title = UserInitiatedProfileName + "." + profile.uid;
- return profile;
-};
diff --git a/WebKit/chromium/src/js/Tests.js b/WebKit/chromium/src/js/Tests.js
index fa0c99f..2b264ee 100644
--- a/WebKit/chromium/src/js/Tests.js
+++ b/WebKit/chromium/src/js/Tests.js
@@ -219,40 +219,6 @@ TestSuite.prototype.addSniffer = function(receiver, methodName, override, opt_st
/**
- * Tests that the real injected host is present in the context.
- */
-TestSuite.prototype.testHostIsPresent = function()
-{
- this.assertTrue(typeof InspectorFrontendHost === "object" && !InspectorFrontendHost.isStub);
-};
-
-
-/**
- * Tests elements tree has an "HTML" root.
- */
-TestSuite.prototype.testElementsTreeRoot = function()
-{
- var doc = WebInspector.domAgent.document;
- this.assertEquals("HTML", doc.documentElement.nodeName);
- this.assertTrue(doc.documentElement.hasChildNodes());
-};
-
-
-/**
- * Tests that main resource is present in the system and that it is
- * the only resource.
- */
-TestSuite.prototype.testMainResource = function()
-{
- var tokens = [];
- var resources = WebInspector.resources;
- for (var id in resources)
- tokens.push(resources[id].lastPathComponent);
- this.assertEquals("simple_page.html", tokens.join(","));
-};
-
-
-/**
* Tests that resources tab is enabled when corresponding item is selected.
*/
TestSuite.prototype.testEnableResourcesTab = function()
@@ -261,10 +227,10 @@ TestSuite.prototype.testEnableResourcesTab = function()
var test = this;
this.addSniffer(WebInspector, "updateResource",
- function(identifier, payload) {
+ function(payload) {
test.assertEquals("simple_page.html", payload.lastPathComponent);
WebInspector.panels.resources.refresh();
- WebInspector.panels.resources.revealAndSelectItem(WebInspector.resources[identifier]);
+ WebInspector.panels.resources.revealAndSelectItem(WebInspector.resources[payload.id]);
test.releaseControl();
});
@@ -279,185 +245,89 @@ TestSuite.prototype.testEnableResourcesTab = function()
/**
- * Tests that correct content length is reported for resources.
- */
-TestSuite.prototype.testResourceContentLength = function()
-{
- this.showPanel("resources");
- var test = this;
-
- var png = false;
- var html = false;
- this.addSniffer(WebInspector, "updateResource",
- function(identifier, payload) {
- if (!payload.didLengthChange)
- return;
- var resource = WebInspector.resources[identifier];
- if (!resource || !resource.url)
- return;
- if (resource.url.search("image.html$") !== -1) {
- var expectedLength = 87;
- test.assertTrue(
- resource.contentLength <= expectedLength,
- "image.html content length is greater thatn expected.");
- if (expectedLength === resource.contentLength)
- html = true;
- } else if (resource.url.search("image.png") !== -1) {
- var expectedLength = 257796;
- test.assertTrue(
- resource.contentLength <= expectedLength,
- "image.png content length is greater than expected.");
- if (expectedLength === resource.contentLength)
- png = true;
- }
- if (html && png) {
- // Wait 1 second before releasing control to check that the content
- // lengths are not updated anymore.
- setTimeout(function() {
- test.releaseControl();
- }, 1000);
- }
- }, true);
-
- // Make sure resource tracking is on.
- WebInspector.panels.resources._enableResourceTracking();
- // Reload inspected page to update all resources.
- test.evaluateInConsole_(
- "window.location.reload(true);",
- function(resultText) {
- test.assertEquals("undefined", resultText, "Unexpected result of reload().");
- });
-
- // We now have some time to report results to controller.
- this.takeControl();
-};
-
-
-/**
- * Tests resource headers.
+ * Tests that profiler works.
*/
-TestSuite.prototype.testResourceHeaders = function()
+TestSuite.prototype.testProfilerTab = function()
{
- this.showPanel("resources");
+ this.showPanel("profiles");
+ var panel = WebInspector.panels.profiles;
var test = this;
- var responseOk = false;
- var timingOk = false;
-
- this.addSniffer(WebInspector, "updateResource",
- function(identifier, payload) {
- var resource = this.resources[identifier];
- if (!resource || resource.mainResource) {
- // We are only interested in secondary resources in this test.
- return;
- }
-
- var requestHeaders = JSON.stringify(resource.requestHeaders);
- test.assertContains(requestHeaders, "Accept");
+ function findDisplayedNode() {
+ var node = panel.visibleView.profileDataGridTree.children[0];
+ if (!node) {
+ // Profile hadn't been queried yet, re-schedule.
+ window.setTimeout(findDisplayedNode, 100);
+ return;
+ }
- if (payload.didResponseChange) {
- var responseHeaders = JSON.stringify(resource.responseHeaders);
- test.assertContains(responseHeaders, "Content-type");
- test.assertContains(responseHeaders, "Content-Length");
- test.assertTrue(typeof resource.responseReceivedTime !== "undefined");
- responseOk = true;
- }
+ // Iterate over displayed functions and search for a function
+ // that is called "fib" or "eternal_fib". If found, this will mean
+ // that we actually have profiled page's code.
+ while (node) {
+ if (node.functionName.indexOf("fib") !== -1)
+ test.releaseControl();
+ node = node.traverseNextNode(true, null, true);
+ }
- if (payload.didTimingChange) {
- test.assertTrue(typeof resource.startTime !== "undefined");
- timingOk = true;
- }
+ test.fail();
+ }
- if (payload.didCompletionChange) {
- test.assertTrue(responseOk);
- test.assertTrue(timingOk);
- test.assertTrue(typeof resource.endTime !== "undefined");
- test.releaseControl();
- }
- }, true);
+ function findVisibleView() {
+ if (!panel.visibleView) {
+ setTimeout(findVisibleView, 0);
+ return;
+ }
+ setTimeout(findDisplayedNode, 0);
+ }
- WebInspector.panels.resources._enableResourceTracking();
+ findVisibleView();
this.takeControl();
};
/**
- * Tests the mime type of a cached (HTTP 304) resource.
+ * Tests that heap profiler works.
*/
-TestSuite.prototype.testCachedResourceMimeType = function()
+TestSuite.prototype.testHeapProfiler = function()
{
- this.showPanel("resources");
+ this.showPanel("profiles");
+ var panel = WebInspector.panels.profiles;
var test = this;
- var hasReloaded = false;
- this.addSniffer(WebInspector, "updateResource",
- function(identifier, payload) {
- var resource = this.resources[identifier];
- if (!resource || resource.mainResource) {
- // We are only interested in secondary resources in this test.
- return;
- }
+ function findDisplayedNode() {
+ var node = panel.visibleView.dataGrid.children[0];
+ if (!node) {
+ // Profile hadn't been queried yet, re-schedule.
+ window.setTimeout(findDisplayedNode, 100);
+ return;
+ }
- if (payload.didResponseChange) {
- // Test server uses a default mime type for JavaScript files.
- test.assertEquals("text/html", payload.mimeType);
- if (!hasReloaded) {
- hasReloaded = true;
- // Reload inspected page to update all resources.
- test.evaluateInConsole_("window.location.reload(true);", function() {});
- } else
- test.releaseControl();
+ // Iterate over displayed functions and find node called "A"
+ // If found, this will mean that we actually have taken heap snapshot.
+ while (node) {
+ if (node.constructorName.indexOf("A") !== -1) {
+ test.releaseControl();
+ return;
}
+ node = node.traverseNextNode(false, null, true);
+ }
- }, true);
-
- WebInspector.panels.resources._enableResourceTracking();
- this.takeControl();
-};
-
-
-/**
- * Tests that profiler works.
- */
-TestSuite.prototype.testProfilerTab = function()
-{
- this.showPanel("profiles");
-
- var test = this;
- this.addSniffer(WebInspector.panels.profiles, "addProfileHeader",
- function(typeOrProfile, profile) {
- if (!profile)
- profile = typeOrProfile;
- var panel = WebInspector.panels.profiles;
- panel.showProfile(profile);
- var node = panel.visibleView.profileDataGridTree.children[0];
- // Iterate over displayed functions and search for a function
- // that is called "fib" or "eternal_fib". If found, it will mean
- // that we actually have profiled page's code.
- while (node) {
- if (node.functionName.indexOf("fib") !== -1)
- test.releaseControl();
- node = node.traverseNextNode(true, null, true);
- }
+ test.fail();
+ }
- test.fail();
- });
- var ticksCount = 0;
- var tickRecord = "\nt,";
- this.addSniffer(RemoteProfilerAgent, "didGetLogLines",
- function(posIgnored, log) {
- var pos = 0;
- while ((pos = log.indexOf(tickRecord, pos)) !== -1) {
- pos += tickRecord.length;
- ticksCount++;
- }
- if (ticksCount > 100)
- InspectorBackend.stopProfiling();
- }, true);
+ function findVisibleView() {
+ if (!panel.visibleView) {
+ setTimeout(findVisibleView, 0);
+ return;
+ }
+ setTimeout(findDisplayedNode, 0);
+ }
- InspectorBackend.startProfiling();
+ WebInspector.HeapSnapshotProfileType.prototype.buttonClicked();
+ findVisibleView();
this.takeControl();
};
@@ -470,7 +340,7 @@ TestSuite.prototype.testShowScriptsTab = function()
this.showPanel("scripts");
var test = this;
// There should be at least main page script.
- this._waitUntilScriptsAreParsed(["debugger_test_page.html$"],
+ this._waitUntilScriptsAreParsed(["debugger_test_page.html"],
function() {
test.releaseControl();
});
@@ -489,31 +359,19 @@ TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh = function()
var test = this;
this.assertEquals(WebInspector.panels.elements, WebInspector.currentPanel, "Elements panel should be current one.");
- this.addSniffer(devtools.DebuggerAgent.prototype, "reset", waitUntilScriptIsParsed);
+ this.addSniffer(WebInspector.panels.scripts, "reset", waitUntilScriptIsParsed);
// Reload inspected page. It will reset the debugger agent.
test.evaluateInConsole_(
"window.location.reload(true);",
- function(resultText) {
- test.assertEquals("undefined", resultText, "Unexpected result of reload().");
- });
+ function(resultText) {});
function waitUntilScriptIsParsed() {
- var parsed = devtools.tools.getDebuggerAgent().parsedScripts_;
- for (var id in parsed) {
- var url = parsed[id].getUrl();
- if (url && url.search("debugger_test_page.html$") !== -1) {
- checkScriptsPanel();
- return;
- }
- }
- test.addSniffer(devtools.DebuggerAgent.prototype, "addScriptInfo_", waitUntilScriptIsParsed);
- }
-
- function checkScriptsPanel() {
test.showPanel("scripts");
- test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html$"]), "Inspected script not found in the scripts list");
- test.releaseControl();
+ test._waitUntilScriptsAreParsed(["debugger_test_page.html"],
+ function() {
+ test.releaseControl();
+ });
}
// Wait until all scripts are added to the debugger.
@@ -530,7 +388,7 @@ TestSuite.prototype.testContentScriptIsPresent = function()
var test = this;
test._waitUntilScriptsAreParsed(
- ["page_with_content_script.html$", "simple_content_script.js$"],
+ ["page_with_content_script.html", "simple_content_script.js"],
function() {
test.releaseControl();
});
@@ -568,7 +426,7 @@ TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function()
function checkScriptsPanel() {
test.assertTrue(!!WebInspector.panels.scripts.visibleView, "No visible script view.");
- test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html$"]), "Some scripts are missing.");
+ test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]), "Some scripts are missing.");
checkNoDuplicates();
test.releaseControl();
}
@@ -584,7 +442,7 @@ TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function()
}
test._waitUntilScriptsAreParsed(
- ["debugger_test_page.html$"],
+ ["debugger_test_page.html"],
function() {
checkNoDuplicates();
setTimeout(switchToElementsTab, 0);
@@ -596,69 +454,6 @@ TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function()
};
-/**
- * Tests that a breakpoint can be set.
- */
-TestSuite.prototype.testSetBreakpoint = function()
-{
- var test = this;
- this.showPanel("scripts");
-
- var breakpointLine = 12;
-
- this._waitUntilScriptsAreParsed(["debugger_test_page.html"],
- function() {
- test.showMainPageScriptSource_(
- "debugger_test_page.html",
- function(view, url) {
- view._addBreakpoint(breakpointLine);
- // Force v8 execution.
- RemoteDebuggerAgent.processDebugCommands();
- test.waitForSetBreakpointResponse_(url, breakpointLine,
- function() {
- test.releaseControl();
- });
- });
- });
-
- this.takeControl();
-};
-
-
-/**
- * Tests that pause on exception works.
- */
-TestSuite.prototype.testPauseOnException = function()
-{
- this.showPanel("scripts");
- var test = this;
-
- // TODO(yurys): remove else branch once the states are supported.
- if (WebInspector.ScriptsPanel.PauseOnExceptionsState) {
- while (WebInspector.currentPanel.pauseOnExceptionButton.state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions)
- WebInspector.currentPanel.pauseOnExceptionButton.element.click();
- } else {
- // Make sure pause on exceptions is on.
- if (!WebInspector.currentPanel.pauseOnExceptionButton.toggled)
- WebInspector.currentPanel.pauseOnExceptionButton.element.click();
- }
-
- this._executeCodeWhenScriptsAreParsed("handleClick()", ["pause_on_exception.html$"]);
-
- this._waitForScriptPause(
- {
- functionsOnStack: ["throwAnException", "handleClick", "(anonymous function)"],
- lineNumber: 6,
- lineText: " return unknown_var;"
- },
- function() {
- test.releaseControl();
- });
-
- this.takeControl();
-};
-
-
// Tests that debugger works correctly if pause event occurs when DevTools
// frontend is being loaded.
TestSuite.prototype.testPauseWhenLoadingDevTools = function()
@@ -729,7 +524,7 @@ TestSuite.prototype.testPauseWhenScriptIsRunning = function()
test._waitForScriptPause(
{
- functionsOnStack: ["handleClick", "(anonymous function)"],
+ functionsOnStack: ["handleClick", ""],
lineNumber: 5,
lineText: " while(true) {"
},
@@ -818,7 +613,7 @@ TestSuite.prototype.showMainPageScriptSource_ = function(scriptName, callback)
*/
TestSuite.prototype.evaluateInConsole_ = function(code, callback)
{
- WebInspector.console.visible = true;
+ WebInspector.showConsole();
WebInspector.console.prompt.text = code;
WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));
@@ -829,83 +624,6 @@ TestSuite.prototype.evaluateInConsole_ = function(code, callback)
};
-/*
- * Waits for "setbreakpoint" response, checks that corresponding breakpoint
- * was successfully set and invokes the callback if it was.
- * @param {string} scriptUrl
- * @param {number} breakpointLine
- * @param {function()} callback
- */
-TestSuite.prototype.waitForSetBreakpointResponse_ = function(scriptUrl, breakpointLine, callback)
-{
- var test = this;
- test.addSniffer(
- devtools.DebuggerAgent.prototype,
- "handleSetBreakpointResponse_",
- function(msg) {
- var bps = this.urlToBreakpoints_[scriptUrl];
- test.assertTrue(!!bps, "No breakpoints for line " + breakpointLine);
- var line = devtools.DebuggerAgent.webkitToV8LineNumber_(breakpointLine);
- test.assertTrue(!!bps[line].getV8Id(), "Breakpoint id was not assigned.");
- callback();
- });
-};
-
-
-/**
- * Tests eval on call frame.
- */
-TestSuite.prototype.testEvalOnCallFrame = function()
-{
- this.showPanel("scripts");
-
- var breakpointLine = 16;
-
- var test = this;
- this.addSniffer(devtools.DebuggerAgent.prototype, "handleScriptsResponse_",
- function(msg) {
- test.showMainPageScriptSource_(
- "debugger_test_page.html",
- function(view, url) {
- view._addBreakpoint(breakpointLine);
- // Force v8 execution.
- RemoteDebuggerAgent.processDebugCommands();
- test.waitForSetBreakpointResponse_(url, breakpointLine, setBreakpointCallback);
- });
- });
-
- function setBreakpointCallback() {
- // Since breakpoints are ignored in evals' calculate() function is
- // execute after zero-timeout so that the breakpoint is hit.
- test.evaluateInConsole_(
- 'setTimeout("calculate(123)" , 0)',
- function(resultText) {
- test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
- waitForBreakpointHit();
- });
- }
-
- function waitForBreakpointHit() {
- test.addSniffer(
- devtools.DebuggerAgent.prototype,
- "handleBacktraceResponse_",
- function(msg) {
- test.assertEquals(2, this.callFrames_.length, "Unexpected stack depth on the breakpoint. " + JSON.stringify(msg));
- test.assertEquals("calculate", this.callFrames_[0].functionName, "Unexpected top frame function.");
- // Evaluate "e+1" where "e" is an argument of "calculate" function.
- test.evaluateInConsole_(
- "e+1",
- function(resultText) {
- test.assertEquals("124", resultText, 'Unexpected "e+1" value.');
- test.releaseControl();
- });
- });
- }
-
- this.takeControl();
-};
-
-
/**
* Tests that console auto completion works when script execution is paused.
*/
@@ -913,19 +631,23 @@ TestSuite.prototype.testCompletionOnPause = function()
{
this.showPanel("scripts");
var test = this;
- this._executeCodeWhenScriptsAreParsed("handleClick()", ["completion_on_pause.html$"]);
+ this._executeCodeWhenScriptsAreParsed("handleClick()", ["completion_on_pause.html"]);
this._waitForScriptPause(
{
- functionsOnStack: ["innerFunction", "handleClick", "(anonymous function)"],
+ functionsOnStack: ["innerFunction", "handleClick", ""],
lineNumber: 9,
lineText: " debugger;"
},
showConsole);
function showConsole() {
- test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion);
- WebInspector.showConsole();
+ if (WebInspector.currentFocusElement === WebInspector.console.promptElement)
+ testLocalsCompletion();
+ else {
+ test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion);
+ WebInspector.showConsole();
+ }
}
function testLocalsCompletion() {
@@ -959,65 +681,6 @@ TestSuite.prototype.testCompletionOnPause = function()
/**
- * Tests that inspected page doesn't hang on reload if it contains a syntax
- * error and DevTools window is open.
- */
-TestSuite.prototype.testAutoContinueOnSyntaxError = function()
-{
- this.showPanel("scripts");
- var test = this;
-
- function checkScriptsList() {
- var scriptSelect = document.getElementById("scripts-files");
- var options = scriptSelect.options;
- // There should be only console API source (see
- // InjectedScript._ensureCommandLineAPIInstalled) since the page script
- // contains a syntax error.
- for (var i = 0 ; i < options.length; i++) {
- if (options[i].text.search("script_syntax_error.html$") !== -1)
- test.fail("Script with syntax error should not be in the list of parsed scripts.");
- }
- }
-
- this.addSniffer(devtools.DebuggerAgent.prototype, "handleScriptsResponse_",
- function(msg) {
- checkScriptsList();
-
- // Reload inspected page.
- test.evaluateInConsole_(
- "window.location.reload(true);",
- function(resultText) {
- test.assertEquals("undefined", resultText, "Unexpected result of reload().");
- waitForExceptionEvent();
- });
- });
-
- function waitForExceptionEvent() {
- var exceptionCount = 0;
- test.addSniffer(
- devtools.DebuggerAgent.prototype,
- "handleExceptionEvent_",
- function(msg) {
- exceptionCount++;
- test.assertEquals(1, exceptionCount, "Too many exceptions.");
- test.assertEquals(undefined, msg.getBody().script, "Unexpected exception: " + JSON.stringify(msg));
- test.releaseControl();
- });
-
- // Check that the script is not paused on parse error.
- test.addSniffer(
- WebInspector,
- "pausedScript",
- function(callFrames) {
- test.fail("Script execution should not pause on syntax error.");
- });
- }
-
- this.takeControl();
-};
-
-
-/**
* Checks current execution line against expectations.
* @param {WebInspector.SourceFrame} sourceFrame
* @param {number} lineNumber Expected line number
@@ -1069,7 +732,8 @@ TestSuite.prototype._waitForScriptPause = function(expectations, callback)
test.addSniffer(
WebInspector,
"pausedScript",
- function(callFrames) {
+ function(details) {
+ var callFrames = details.callFrames;
var functionsOnStack = [];
for (var i = 0; i < callFrames.length; i++)
functionsOnStack.push(callFrames[i].functionName);
@@ -1109,25 +773,6 @@ TestSuite.prototype._checkSourceFrameWhenLoaded = function(expectations, callbac
/**
- * Performs sequence of steps.
- * @param {Array.<Object|Function>} Array [expectations1,action1,expectations2,
- * action2,...,actionN].
- */
-TestSuite.prototype._performSteps = function(actions)
-{
- var test = this;
- var i = 0;
- function doNextAction() {
- if (i > 0)
- actions[i++]();
- if (i < actions.length - 1)
- test._waitForScriptPause(actions[i++], doNextAction);
- }
- doNextAction();
-};
-
-
-/**
* Waits until all the scripts are parsed and asynchronously executes the code
* in the inspected page.
*/
@@ -1141,7 +786,7 @@ TestSuite.prototype._executeCodeWhenScriptsAreParsed = function(code, expectedSc
test.evaluateInConsole_(
'setTimeout("' + code + '" , 0)',
function(resultText) {
- test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+ test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText + ". Code: " + code);
});
}
@@ -1168,355 +813,6 @@ TestSuite.prototype._waitUntilScriptsAreParsed = function(expectedScripts, callb
/**
- * Waits until all debugger scripts are parsed and executes "a()" in the
- * inspected page.
- */
-TestSuite.prototype._executeFunctionForStepTest = function()
-{
- this._executeCodeWhenScriptsAreParsed("a()", ["debugger_step.html$", "debugger_step.js$"]);
-};
-
-
-/**
- * Tests step over in the debugger.
- */
-TestSuite.prototype.testStepOver = function()
-{
- this.showPanel("scripts");
- var test = this;
-
- this._executeFunctionForStepTest();
-
- this._performSteps([
- {
- functionsOnStack: ["d","a","(anonymous function)"],
- lineNumber: 3,
- lineText: " debugger;"
- },
- function() {
- document.getElementById("scripts-step-over").click();
- },
- {
- functionsOnStack: ["d","a","(anonymous function)"],
- lineNumber: 5,
- lineText: " var y = fact(10);"
- },
- function() {
- document.getElementById("scripts-step-over").click();
- },
- {
- functionsOnStack: ["d","a","(anonymous function)"],
- lineNumber: 6,
- lineText: " return y;"
- },
- function() {
- test.releaseControl();
- }
- ]);
-
- test.takeControl();
-};
-
-
-/**
- * Tests step out in the debugger.
- */
-TestSuite.prototype.testStepOut = function()
-{
- this.showPanel("scripts");
- var test = this;
-
- this._executeFunctionForStepTest();
-
- this._performSteps([
- {
- functionsOnStack: ["d","a","(anonymous function)"],
- lineNumber: 3,
- lineText: " debugger;"
- },
- function() {
- document.getElementById("scripts-step-out").click();
- },
- {
- functionsOnStack: ["a","(anonymous function)"],
- lineNumber: 8,
- lineText: " printResult(result);"
- },
- function() {
- test.releaseControl();
- }
- ]);
-
- test.takeControl();
-};
-
-
-/**
- * Tests step in in the debugger.
- */
-TestSuite.prototype.testStepIn = function()
-{
- this.showPanel("scripts");
- var test = this;
-
- this._executeFunctionForStepTest();
-
- this._performSteps([
- {
- functionsOnStack: ["d","a","(anonymous function)"],
- lineNumber: 3,
- lineText: " debugger;"
- },
- function() {
- document.getElementById("scripts-step-over").click();
- },
- {
- functionsOnStack: ["d","a","(anonymous function)"],
- lineNumber: 5,
- lineText: " var y = fact(10);"
- },
- function() {
- document.getElementById("scripts-step-into").click();
- },
- {
- functionsOnStack: ["fact","d","a","(anonymous function)"],
- lineNumber: 15,
- lineText: " return r;"
- },
- function() {
- test.releaseControl();
- }
- ]);
-
- test.takeControl();
-};
-
-
-/**
- * Gets a XPathResult matching given xpath.
- * @param {string} xpath
- * @param {number} resultType
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- * will be used
- * @return {XPathResult} Type of returned value is determined by "resultType" parameter
- */
-
-TestSuite.prototype._evaluateXpath = function(xpath, resultType, opt_ancestor)
-{
- if (!opt_ancestor)
- opt_ancestor = document.documentElement;
- try {
- return document.evaluate(xpath, opt_ancestor, null, resultType, null);
- } catch(e) {
- this.fail('Error in expression: "' + xpath + '".' + e);
- }
-};
-
-
-/**
- * Gets first Node matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- * will be used
- * @return {?Node}
- */
-TestSuite.prototype._findNode = function(xpath, opt_ancestor)
-{
- var result = this._evaluateXpath(xpath, XPathResult.FIRST_ORDERED_NODE_TYPE, opt_ancestor).singleNodeValue;
- this.assertTrue(!!result, "Cannot find node on path: " + xpath);
- return result;
-};
-
-
-/**
- * Gets a text matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- * will be used
- * @return {?string}
- */
-TestSuite.prototype._findText = function(xpath, opt_ancestor)
-{
- var result = this._evaluateXpath(xpath, XPathResult.STRING_TYPE, opt_ancestor).stringValue;
- this.assertTrue(!!result, "Cannot find text on path: " + xpath);
- return result;
-};
-
-
-/**
- * Gets an iterator over nodes matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified, documentElement
- * will be used
- * @return {XPathResult} Iterator over the nodes
- */
-TestSuite.prototype._nodeIterator = function(xpath, opt_ancestor)
-{
- return this._evaluateXpath(xpath, XPathResult.ORDERED_NODE_ITERATOR_TYPE, opt_ancestor);
-};
-
-
-/**
- * Checks the scopeSectionDiv against the expectations.
- * @param {Node} scopeSectionDiv The section div
- * @param {Object} expectations Expectations dictionary
- */
-TestSuite.prototype._checkScopeSectionDiv = function(scopeSectionDiv, expectations)
-{
- var scopeTitle = this._findText('./div[@class="header"]/div[@class="title"]/text()', scopeSectionDiv);
- this.assertEquals(expectations.title, scopeTitle, "Unexpected scope section title.");
- if (!expectations.properties)
- return;
- this.assertTrue(scopeSectionDiv.hasStyleClass("expanded"), 'Section "' + scopeTitle + '" is collapsed.');
-
- var propertyIt = this._nodeIterator("./ol/li", scopeSectionDiv);
- var propertyLi;
- var foundProps = [];
- while (propertyLi = propertyIt.iterateNext()) {
- var name = this._findText('./span[@class="name"]/text()', propertyLi);
- var value = this._findText('./span[@class="value"]/text()', propertyLi);
- this.assertTrue(!!name, 'Invalid variable name: "' + name + '"');
- this.assertTrue(name in expectations.properties, "Unexpected property: " + name);
- this.assertEquals(expectations.properties[name], value, 'Unexpected "' + name + '" property value.');
- delete expectations.properties[name];
- foundProps.push(name + " = " + value);
- }
-
- // Check that all expected properties were found.
- for (var p in expectations.properties)
- this.fail('Property "' + p + '" was not found in scope "' + scopeTitle + '". Found properties: "' + foundProps.join(",") + '"');
-};
-
-
-/**
- * Expands scope sections matching the filter and invokes the callback on
- * success.
- * @param {function(WebInspector.ObjectPropertiesSection, number):boolean}
- * filter
- * @param {Function} callback
- */
-TestSuite.prototype._expandScopeSections = function(filter, callback)
-{
- var sections = WebInspector.currentPanel.sidebarPanes.scopechain.sections;
-
- var toBeUpdatedCount = 0;
- function updateListener() {
- --toBeUpdatedCount;
- if (toBeUpdatedCount === 0) {
- // Report when all scopes are expanded and populated.
- callback();
- }
- }
-
- // Global scope is always the last one.
- for (var i = 0; i < sections.length - 1; i++) {
- var section = sections[i];
- if (!filter(sections, i))
- continue;
- ++toBeUpdatedCount;
- var populated = section.populated;
-
- this._hookGetPropertiesCallback(updateListener,
- function() {
- section.expand();
- if (populated) {
- // Make sure "updateProperties" callback will be called at least once
- // after it was overridden.
- section.update();
- }
- });
- }
-};
-
-
-/**
- * Tests that scopes can be expanded and contain expected data.
- */
-TestSuite.prototype.testExpandScope = function()
-{
- this.showPanel("scripts");
- var test = this;
-
- this._executeCodeWhenScriptsAreParsed("handleClick()", ["debugger_closure.html$"]);
-
- this._waitForScriptPause(
- {
- functionsOnStack: ["innerFunction", "handleClick", "(anonymous function)"],
- lineNumber: 8,
- lineText: " debugger;"
- },
- expandAllSectionsExceptGlobal);
-
- // Expanding Global scope takes for too long so we skeep it.
- function expandAllSectionsExceptGlobal() {
- test._expandScopeSections(function(sections, i) {
- return i < sections.length - 1;
- },
- examineScopes /* When all scopes are expanded and populated check them. */);
- }
-
- // Check scope sections contents.
- function examineScopes() {
- var scopeVariablesSection = test._findNode('//div[@id="scripts-sidebar"]/div[div[@class="title"]/text()="Scope Variables"]');
- var expectedScopes = [
- {
- title: "Local",
- properties: {
- x:"2009",
- innerFunctionLocalVar:"2011",
- "this": "global",
- }
- },
- {
- title: "Closure",
- properties: {
- n:"TextParam",
- makeClosureLocalVar:"local.TextParam",
- }
- },
- {
- title: "Global",
- },
- ];
- var it = test._nodeIterator('./div[@class="body"]/div', scopeVariablesSection);
- var scopeIndex = 0;
- var scopeDiv;
- while (scopeDiv = it.iterateNext()) {
- test.assertTrue(scopeIndex < expectedScopes.length, "Too many scopes.");
- test._checkScopeSectionDiv(scopeDiv, expectedScopes[scopeIndex]);
- ++scopeIndex;
- }
- test.assertEquals(expectedScopes.length, scopeIndex, "Unexpected number of scopes.");
-
- test.releaseControl();
- }
-
- test.takeControl();
-};
-
-
-/**
- * Returns child tree element for a property with given name.
- * @param {TreeElement} parent Parent tree element.
- * @param {string} childName
- * @param {string} objectPath Path to the object. Will be printed in the case
- * of failure.
- * @return {TreeElement}
- */
-TestSuite.prototype._findChildProperty = function(parent, childName, objectPath)
-{
- var children = parent.children;
- for (var i = 0; i < children.length; i++) {
- var treeElement = children[i];
- var property = treeElement.property;
- if (property.name === childName)
- return treeElement;
- }
- this.fail('Cannot find property "' + childName + '" in ' + objectPath);
-};
-
-
-/**
* Executes the 'code' with InjectedScriptAccess.getProperties overriden
* so that all callbacks passed to InjectedScriptAccess.getProperties are
* extended with the "hook".
@@ -1543,128 +839,6 @@ TestSuite.prototype._hookGetPropertiesCallback = function(hook, code)
/**
- * Tests that all elements in prototype chain of an object have expected
- * intrinic proprties(__proto__, constructor, prototype).
- */
-TestSuite.prototype.testDebugIntrinsicProperties = function()
-{
- this.showPanel("scripts");
- var test = this;
-
- this._executeCodeWhenScriptsAreParsed("handleClick()", ["debugger_intrinsic_properties.html$"]);
-
- this._waitForScriptPause(
- {
- functionsOnStack: ["callDebugger", "handleClick", "(anonymous function)"],
- lineNumber: 29,
- lineText: " debugger;"
- },
- expandLocalScope);
-
- var localScopeSection = null;
- function expandLocalScope() {
- test._expandScopeSections(function(sections, i) {
- if (i === 0) {
- test.assertTrue(sections[i].object.isLocal, "Scope #0 is not Local.");
- localScopeSection = sections[i];
- return true;
- }
- return false;
- },
- examineLocalScope);
- }
-
- function examineLocalScope() {
- var scopeExpectations = [
- "a", "Object", [
- "constructor", "function Child()", [
- "constructor", "function Function()", null,
- "name", "Child", null,
- "prototype", "Object", [
- "childProtoField", 21, null
- ]
- ],
-
- "__proto__", "Object", [
- "__proto__", "Object", [
- "__proto__", "Object", [
- "__proto__", "null", null,
- "constructor", "function Object()", null,
- ],
- "constructor", "function Parent()", [
- "name", "Parent", null,
- "prototype", "Object", [
- "parentProtoField", 11, null,
- ]
- ],
- "parentProtoField", 11, null,
- ],
- "constructor", "function Child()", null,
- "childProtoField", 21, null,
- ],
-
- "parentField", 10, null,
- "childField", 20, null,
- ]
- ];
-
- checkProperty(localScopeSection.propertiesTreeOutline, "<Local Scope>", scopeExpectations);
- }
-
- var propQueue = [];
- var index = 0;
- var expectedFinalIndex = 8;
-
- function expandAndCheckNextProperty() {
- if (index === propQueue.length) {
- test.assertEquals(expectedFinalIndex, index, "Unexpected number of expanded objects.");
- test.releaseControl();
- return;
- }
-
- // Read next property data from the queue.
- var treeElement = propQueue[index].treeElement;
- var path = propQueue[index].path;
- var expectations = propQueue[index].expectations;
- index++;
-
- // Expand the property.
- test._hookGetPropertiesCallback(function() {
- checkProperty(treeElement, path, expectations);
- },
- function() {
- treeElement.expand();
- });
- }
-
- function checkProperty(treeElement, path, expectations) {
- for (var i = 0; i < expectations.length; i += 3) {
- var name = expectations[i];
- var description = expectations[i+1];
- var value = expectations[i+2];
-
- var propertyPath = path + "." + name;
- var propertyTreeElement = test._findChildProperty(treeElement, name, path);
- test.assertTrue(propertyTreeElement, 'Property "' + propertyPath + '" not found.');
- test.assertEquals(description, propertyTreeElement.property.value.description, 'Unexpected "' + propertyPath + '" description.');
- if (value) {
- // Schedule property content check.
- propQueue.push({
- treeElement: propertyTreeElement,
- path: propertyPath,
- expectations: value,
- });
- }
- }
- // Check next property in the queue.
- expandAndCheckNextProperty();
- }
-
- test.takeControl();
-};
-
-
-/**
* Tests "Pause" button will pause debugger when a snippet is evaluated.
*/
TestSuite.prototype.testPauseInEval = function()
@@ -1699,138 +873,6 @@ TestSuite.createKeyEvent = function(keyIdentifier)
/**
- * Tests console eval.
- */
-TestSuite.prototype.testConsoleEval = function()
-{
- var test = this;
- this.evaluateInConsole_("123",
- function(resultText) {
- test.assertEquals("123", resultText);
- test.releaseControl();
- });
-
- this.takeControl();
-};
-
-
-/**
- * Tests console log.
- */
-TestSuite.prototype.testConsoleLog = function()
-{
- WebInspector.console.visible = true;
- var messages = WebInspector.console.messages;
- var index = 0;
-
- var test = this;
- var assertNext = function(line, message, opt_class, opt_count, opt_substr) {
- var elem = messages[index++].toMessageElement();
- var clazz = elem.getAttribute("class");
- var expectation = (opt_count || '') + 'console_test_page.html:' + line + message;
- if (opt_substr)
- test.assertContains(elem.textContent, expectation);
- else
- test.assertEquals(expectation, elem.textContent);
- if (opt_class)
- test.assertContains(clazz, "console-" + opt_class);
- };
-
- assertNext("5", "log", "log-level");
- assertNext("7", "debug", "log-level");
- assertNext("9", "info", "log-level");
- assertNext("11", "warn", "warning-level");
- assertNext("13", "error", "error-level");
- assertNext("15", "Message format number 1, 2 and 3.5");
- assertNext("17", "Message format for string");
- assertNext("19", "Object Object");
- assertNext("22", "repeated", "log-level", 5);
- assertNext("26", "count: 1");
- assertNext("26", "count: 2");
- assertNext("29", "group", "group-title");
- index++;
- assertNext("33", "timer:", "log-level", "", true);
- assertNext("35", "1 2 3", "log-level");
- assertNext("37", "HTMLDocument", "log-level");
- assertNext("39", "<html>", "log-level", "", true);
-};
-
-
-/**
- * Tests eval of global objects.
- */
-TestSuite.prototype.testEvalGlobal = function()
-{
- WebInspector.console.visible = true;
-
- var inputs = ["foo", "foobar"];
- var expectations = ["foo", "fooValue", "foobar", "ReferenceError: foobar is not defined"];
-
- // Do not change code below - simply add inputs and expectations above.
- var initEval = function(input) {
- WebInspector.console.prompt.text = input;
- WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));
- };
- var test = this;
- var messagesCount = 0;
- var inputIndex = 0;
- this.addSniffer(WebInspector.ConsoleView.prototype, "addMessage",
- function(commandResult) {
- messagesCount++;
- if (messagesCount === expectations.length) {
- var messages = WebInspector.console.messages;
- for (var i = 0; i < expectations; ++i) {
- var elem = messages[i++].toMessageElement();
- test.assertEquals(elem.textContent, expectations[i]);
- }
- test.releaseControl();
- } else if (messagesCount % 2 === 0)
- initEval(inputs[inputIndex++]);
- }, true);
-
- initEval(inputs[inputIndex++]);
- this.takeControl();
-};
-
-
-/**
- * Tests that Storage panel can be open and that local DOM storage is added
- * to the panel.
- */
-TestSuite.prototype.testShowStoragePanel = function()
-{
- var test = this;
- this.addSniffer(WebInspector.panels.storage, "addDOMStorage",
- function(storage) {
- var orig = storage.getEntries;
- storage.getEntries = function(callback) {
- orig.call(this, function(entries) {
- callback(entries);
- test.releaseControl();
- });
- };
- try {
- WebInspector.currentPanel.selectDOMStorage(storage.id);
- storage.getEntries = orig;
- } catch (e) {
- test.fail("Exception in selectDOMStorage: " + e);
- }
- });
- this.showPanel("storage");
-
- // Access localStorage so that it's pushed to the frontend.
- this.evaluateInConsole_(
- 'setTimeout("localStorage.x = 10" , 0)',
- function(resultText) {
- test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
- });
-
- // Wait until DOM storage is added to the panel.
- this.takeControl();
-};
-
-
-/**
* Test runner for the test suite.
*/
var uiTests = {};
@@ -1855,8 +897,37 @@ uiTests.runAllTests = function()
*/
uiTests.runTest = function(name)
{
- new TestSuite().runTest(name);
+ if (uiTests._populatedInterface)
+ new TestSuite().runTest(name);
+ else
+ uiTests._pendingTestName = name;
};
+(function() {
+
+function runTests()
+{
+ uiTests._populatedInterface = true;
+ var name = uiTests._pendingTestName;
+ delete uiTests._pendingTestName;
+ if (name)
+ new TestSuite().runTest(name);
+}
+
+var oldShowElementsPanel = WebInspector.showElementsPanel;
+WebInspector.showElementsPanel = function()
+{
+ oldShowElementsPanel.call(this);
+ runTests();
+}
+
+var oldShowPanel = WebInspector.showPanel;
+WebInspector.showPanel = function(name)
+{
+ oldShowPanel.call(this, name);
+ runTests();
+}
+
+})();
}
diff --git a/WebKit/chromium/src/js/devTools.css b/WebKit/chromium/src/js/devTools.css
index 1fa935f..64ea9d5 100755..100644
--- a/WebKit/chromium/src/js/devTools.css
+++ b/WebKit/chromium/src/js/devTools.css
@@ -1,7 +1,3 @@
-#scripts-files option.injected {
- color: rgb(70, 134, 240);
-}
-
.data-grid table {
line-height: 120%;
}
@@ -13,200 +9,98 @@ body.attached #toolbar {
padding-left: 0;
}
-
/* Chrome theme overrides */
-body.platform-windows #toolbar {
- background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(242, 247, 253)), to(rgb(223, 234, 248)));
-}
-
-body.platform-windows.inactive #toolbar {
- background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(248, 248, 248)), to(rgb(237, 237, 237)));
-}
-
-
-/* Heap Profiler Styles */
-
-.heap-snapshot-status-bar-item .glyph {
- -webkit-mask-image: url(Images/focusButtonGlyph.png);
-}
-.heap-snapshot-sidebar-tree-item .icon {
- content: url(Images/profileIcon.png);
-}
-
-.heap-snapshot-sidebar-tree-item.small .icon {
- content: url(Images/profileSmallIcon.png);
-}
-
-.heap-snapshot-view {
- display: none;
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
-}
-
-.heap-snapshot-view.visible {
- display: block;
-}
-
-.heap-snapshot-view .data-grid {
- border: none;
- max-height: 100%;
- position: absolute;
- left: 0;
- right: 0;
- top: 0;
- bottom: 93px;
-}
-
-.heap-snapshot-view .data-grid th.count-column {
- text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.count-column {
- text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.size-column {
- text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.size-column {
- text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.countDelta-column {
- text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.countDelta-column {
- text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.sizeDelta-column {
- text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.sizeDelta-column {
- text-align: right;
+body.platform-windows #toolbar, body.platform-windows.inactive #toolbar {
+ background-image: none;
}
-#heap-snapshot-summary-container {
- position: absolute;
- padding-top: 20px;
- bottom: 0;
- left: 0;
- right: 0;
- height: 93px;
- margin-left: -1px;
- border-left: 1px solid rgb(102, 102, 102);
- background-color: rgb(101, 111, 130);
- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
- background-repeat: repeat-x;
- background-position: top;
- text-align: center;
- text-shadow: black 0 1px 1px;
- white-space: nowrap;
- color: white;
- -webkit-background-size: 1px 6px;
- -webkit-background-origin: padding;
- -webkit-background-clip: padding;
+body.detached.platform-mac-leopard #toolbar {
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(175, 175, 175)), to(rgb(151, 151, 151))) !important;
}
-.heap-snapshot-summary {
- display: inline-block;
- width: 50%;
- min-width: 300px;
- position: relative;
+body.detached.platform-mac-leopard.inactive #toolbar {
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(221, 221, 221)), to(rgb(207, 207, 207))) !important;
}
-.heap-snapshot-summary canvas.summary-graph {
- width: 225px;
+body.detached.platform-mac-snowleopard #toolbar {
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(189, 189, 189)), to(rgb(151, 151, 151))) !important;
}
-.heap-snapshot-summary-label {
- font-size: 12px;
- font-weight: bold;
- position: absolute;
- top: 1px;
- width: 50%;
- left: 25%;
+body.detached.platform-mac-snowleopard.inactive #toolbar {
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(215, 215, 215)), to(rgb(207, 207, 207))) !important;
}
-body.platform-windows .section > .header {
- border: 1px solid rgb(92, 116, 157);
- background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(105, 133, 180)), to(rgb(92, 116, 157)));
+body.platform-linux #scripts-files {
+ font-size: 11px;
+ font-weight: normal;
+ line-height: 12px;
}
-body.platform-windows .console-group-messages .section > .header {
+.console-group-messages .section > .header {
padding: 0 8px 0 0;
background-image: none;
border: none;
min-height: 0;
}
-body.platform-windows #resources-filter {
+#resources-filter {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(233, 233, 233)));
}
-body.platform-windows .crumbs .crumb {
+.crumbs .crumb {
-webkit-border-image: url(Images/segmentChromium.png) 0 12 0 2;
+ margin-right: -3px;
+ padding-left: 6px;
}
-body.platform-windows .crumbs .crumb.end {
- -webkit-border-image: url(Images/segmentEndChromium.png) 0 2 0 2;
-}
-
-body.platform-windows .crumbs .crumb.selected {
+.crumbs .crumb.selected {
-webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
color: white;
text-shadow: rgba(255, 255, 255, 0.5) 0 0px 0;
}
-body.platform-windows .crumbs .crumb.selected:hover {
+.crumbs .crumb.selected:hover {
-webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
}
-body.platform-windows .crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
+.crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
-webkit-border-image: url(Images/segmentSelectedEndChromium.png) 0 2 0 2;
}
-body.platform-windows .crumbs .crumb:hover {
+.crumbs .crumb:hover {
-webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
}
-body.platform-windows .crumbs .crumb.dimmed:hover {
+.crumbs .crumb.dimmed:hover {
-webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
}
-body.platform-windows .crumbs .crumb.end:hover {
+.crumbs .crumb.end:hover {
-webkit-border-image: url(Images/segmentHoverEndChromium.png) 0 2 0 2;
}
-body.platform-windows body.drawer-visible #main-status-bar {
+body.drawer-visible #main-status-bar {
background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackgroundChromium.png);
}
-body.platform-windows .status-bar {
+.status-bar {
background-image: url(Images/statusbarBackgroundChromium.png);
}
-body.platform-windows button.status-bar-item {
+button.status-bar-item {
background-image: url(Images/statusbarButtonsChromium.png);
}
-body.platform-windows select.status-bar-item:active {
+select.status-bar-item:active {
-webkit-border-image: url(Images/statusbarMenuButtonSelectedChromium.png) 0 17 0 2;
}
-body.platform-windows #drawer {
+#drawer {
background-image: url(Images/statusbarBottomBackgroundChromium.png);
}
-body.platform-windows select.status-bar-item {
+select.status-bar-item {
-webkit-border-image: url(Images/statusbarMenuButtonChromium.png) 0 17 0 2;
}
@@ -218,6 +112,6 @@ body.platform-windows select.status-bar-item {
-webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
}
-.timeline-category-tree-item input {
+.timeline-category-statusbar-item input {
vertical-align: middle;
}
diff --git a/WebKit/chromium/src/linux/WebFontRenderStyle.cpp b/WebKit/chromium/src/linux/WebFontRenderStyle.cpp
new file mode 100644
index 0000000..0b864d1
--- /dev/null
+++ b/WebKit/chromium/src/linux/WebFontRenderStyle.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+#include "config.h"
+#include "WebFontRenderStyle.h"
+
+#include "FontRenderStyle.h"
+
+using WebCore::FontRenderStyle;
+
+namespace WebKit {
+
+void WebFontRenderStyle::toFontRenderStyle(FontRenderStyle* out)
+{
+ out->useBitmaps = useBitmaps;
+ out->useAutoHint = useAutoHint;
+ out->useHinting = useHinting;
+ out->hintStyle = hintStyle;
+ out->useAntiAlias = useAntiAlias;
+ out->useSubpixel = useSubpixel;
+}
+
+void WebFontRenderStyle::setDefaults()
+{
+ useBitmaps = 2;
+ useAutoHint = 2;
+ useHinting = 2;
+ hintStyle = 0;
+ useAntiAlias = 2;
+ useSubpixel = 2;
+}
+
+} // namespace WebKit
diff --git a/WebKit/chromium/src/mac/WebInputEventFactory.mm b/WebKit/chromium/src/mac/WebInputEventFactory.mm
index 46b0afe..55883c9 100644
--- a/WebKit/chromium/src/mac/WebInputEventFactory.mm
+++ b/WebKit/chromium/src/mac/WebInputEventFactory.mm
@@ -856,11 +856,36 @@ static inline int modifiersFromEvent(NSEvent* event) {
modifiers |= WebInputEvent::AltKey;
if ([event modifierFlags] & NSCommandKeyMask)
modifiers |= WebInputEvent::MetaKey;
+ if ([event modifierFlags] & NSAlphaShiftKeyMask)
+ modifiers |= WebInputEvent::CapsLockOn;
// TODO(port): Set mouse button states
return modifiers;
}
+static inline void setWebEventLocationFromEventInView(WebMouseEvent* result,
+ NSEvent* event,
+ NSView* view) {
+ NSPoint windowLocal = [event locationInWindow];
+
+ NSPoint screenLocal = [[view window] convertBaseToScreen:windowLocal];
+ result->globalX = screenLocal.x;
+ // Flip y.
+ NSScreen* primaryScreen = ([[NSScreen screens] count] > 0) ?
+ [[NSScreen screens] objectAtIndex:0] : nil;
+ if (primaryScreen)
+ result->globalY = [primaryScreen frame].size.height - screenLocal.y;
+ else
+ result->globalY = screenLocal.y;
+
+ NSPoint contentLocal = [view convertPoint:windowLocal fromView:nil];
+ result->x = contentLocal.x;
+ result->y = [view frame].size.height - contentLocal.y; // Flip y.
+
+ result->windowX = result->x;
+ result->windowY = result->y;
+}
+
WebKeyboardEvent WebInputEventFactory::keyboardEvent(NSEvent* event)
{
WebKeyboardEvent result;
@@ -991,14 +1016,17 @@ WebMouseEvent WebInputEventFactory::mouseEvent(NSEvent* event, NSView* view)
break;
case NSLeftMouseUp:
result.type = WebInputEvent::MouseUp;
+ result.clickCount = [event clickCount];
result.button = WebMouseEvent::ButtonLeft;
break;
case NSOtherMouseUp:
result.type = WebInputEvent::MouseUp;
+ result.clickCount = [event clickCount];
result.button = WebMouseEvent::ButtonMiddle;
break;
case NSRightMouseUp:
result.type = WebInputEvent::MouseUp;
+ result.clickCount = [event clickCount];
result.button = WebMouseEvent::ButtonRight;
break;
case NSMouseMoved:
@@ -1021,16 +1049,7 @@ WebMouseEvent WebInputEventFactory::mouseEvent(NSEvent* event, NSView* view)
ASSERT_NOT_REACHED();
}
- NSPoint location = [NSEvent mouseLocation]; // global coordinates
- result.globalX = location.x;
- result.globalY = [[[view window] screen] frame].size.height - location.y;
-
- NSPoint windowLocal = [event locationInWindow];
- location = [view convertPoint:windowLocal fromView:nil];
- result.y = [view frame].size.height - location.y; // flip y
- result.x = location.x;
- result.windowX = result.x;
- result.windowY = result.y;
+ setWebEventLocationFromEventInView(&result, event, view);
result.modifiers = modifiersFromEvent(event);
@@ -1050,16 +1069,7 @@ WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(NSEvent* event, NSView*
result.modifiers = modifiersFromEvent(event);
- // Set coordinates by translating event coordinates from screen to client.
- NSPoint location = [NSEvent mouseLocation]; // global coordinates
- result.globalX = location.x;
- result.globalY = location.y;
- NSPoint windowLocal = [event locationInWindow];
- location = [view convertPoint:windowLocal fromView:nil];
- result.x = location.x;
- result.y = [view frame].size.height - location.y; // flip y
- result.windowX = result.x;
- result.windowY = result.y;
+ setWebEventLocationFromEventInView(&result, event, view);
// Of Mice and Men
// ---------------
@@ -1173,22 +1183,19 @@ WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(NSEvent* event, NSView*
// the point delta data instead, since we cannot distinguish trackpad data
// from data from any other continuous device.
+ // Conversion between wheel delta amounts and number of pixels to scroll.
+ static const double scrollbarPixelsPerCocoaTick = 40.0;
+
if (CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventIsContinuous)) {
- result.wheelTicksY = result.deltaY =
- CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis1);
- result.wheelTicksX = result.deltaX =
- CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis2);
+ result.deltaX = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis2);
+ result.deltaY = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis1);
+ result.wheelTicksX = result.deltaX / scrollbarPixelsPerCocoaTick;
+ result.wheelTicksY = result.deltaY / scrollbarPixelsPerCocoaTick;
} else {
- result.wheelTicksY =
- CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis1);
- result.wheelTicksX =
- CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis2);
-
- // Convert wheel delta amount to a number of pixels to scroll.
- static const double scrollbarPixelsPerCocoaTick = 40.0;
-
result.deltaX = [event deltaX] * scrollbarPixelsPerCocoaTick;
result.deltaY = [event deltaY] * scrollbarPixelsPerCocoaTick;
+ result.wheelTicksY = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis1);
+ result.wheelTicksX = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis2);
}
result.timeStampSeconds = [event timestamp];
diff --git a/WebKit/chromium/src/win/WebInputEventFactory.cpp b/WebKit/chromium/src/win/WebInputEventFactory.cpp
index a5bd935..c71a3b6 100644
--- a/WebKit/chromium/src/win/WebInputEventFactory.cpp
+++ b/WebKit/chromium/src/win/WebInputEventFactory.cpp
@@ -86,6 +86,16 @@ static bool isKeyPad(WPARAM wparam, LPARAM lparam)
return keypad;
}
+// Loads the state for toggle keys into the event.
+static void SetToggleKeyState(WebInputEvent* event)
+{
+ // Low bit set from GetKeyState indicates "toggled".
+ if (::GetKeyState(VK_NUMLOCK) & 1)
+ event->modifiers |= WebInputEvent::NumLockOn;
+ if (::GetKeyState(VK_CAPITAL) & 1)
+ event->modifiers |= WebInputEvent::CapsLockOn;
+}
+
WebKeyboardEvent WebInputEventFactory::keyboardEvent(HWND hwnd, UINT message,
WPARAM wparam, LPARAM lparam)
{
@@ -144,6 +154,7 @@ WebKeyboardEvent WebInputEventFactory::keyboardEvent(HWND hwnd, UINT message,
if (isKeyPad(wparam, lparam))
result.modifiers |= WebInputEvent::IsKeyPad;
+ SetToggleKeyState(&result);
return result;
}
@@ -289,6 +300,7 @@ WebMouseEvent WebInputEventFactory::mouseEvent(HWND hwnd, UINT message,
if (wparam & MK_RBUTTON)
result.modifiers |= WebInputEvent::RightButtonDown;
+ SetToggleKeyState(&result);
return result;
}
@@ -386,6 +398,8 @@ WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(HWND hwnd, UINT message
if (keyState & MK_RBUTTON)
result.modifiers |= WebInputEvent::RightButtonDown;
+ SetToggleKeyState(&result);
+
// Set coordinates by translating event coordinates from screen to client.
POINT clientPoint = { result.globalX, result.globalY };
MapWindowPoints(0, hwnd, &clientPoint, 1);
@@ -398,11 +412,14 @@ WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(HWND hwnd, UINT message
//
// How many pixels should we scroll per line? Gecko uses the height of the
// current line, which means scroll distance changes as you go through the
- // page or go to different pages. IE 7 is ~50 px/line, although the value
- // seems to vary slightly by page and zoom level. Since IE 7 has a smoothing
- // algorithm on scrolling, it can get away with slightly larger scroll values
- // without feeling jerky. Here we use 100 px per three lines (the default
- // scroll amount is three lines per wheel tick).
+ // page or go to different pages. IE 8 is ~60 px/line, although the value
+ // seems to vary slightly by page and zoom level. Also, IE defaults to
+ // smooth scrolling while Firefox doesn't, so it can get away with somewhat
+ // larger scroll values without feeling as jerky. Here we use 100 px per
+ // three lines (the default scroll amount is three lines per wheel tick).
+ // Even though we have smooth scrolling, we don't make this as large as IE
+ // because subjectively IE feels like it scrolls farther than you want while
+ // reading articles.
static const float scrollbarPixelsPerLine = 100.0f / 3.0f;
wheelDelta /= WHEEL_DELTA;
float scrollDelta = wheelDelta;