Index: WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp |
=================================================================== |
--- WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp (revision 67096) |
+++ WebKit/chromium/src/WebGeolocationServiceBridgeImpl.cpp (working copy) |
@@ -82,10 +82,12 @@ |
virtual void onWebGeolocationServiceDestroyed(); |
private: |
- WebViewClient* getWebViewClient(); |
- |
+ 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; |
+ GeolocationServiceChromium* m_geolocationServiceChromium; |
int m_bridgeId; |
}; |
@@ -95,49 +97,47 @@ |
} |
WebGeolocationServiceBridgeImpl::WebGeolocationServiceBridgeImpl(GeolocationServiceChromium* geolocationServiceChromium) |
- : m_GeolocationServiceChromium(geolocationServiceChromium) |
+ : m_webGeolocationService(0) |
+ , m_geolocationServiceChromium(geolocationServiceChromium) |
, m_bridgeId(0) |
{ |
} |
WebGeolocationServiceBridgeImpl::~WebGeolocationServiceBridgeImpl() |
{ |
- WebKit::WebViewClient* webViewClient = getWebViewClient(); |
- // Geolocation has an OwnPtr to us, and it's destroyed after the frame has |
- // been potentially disconnected. In this case, it calls stopUpdating() |
- // has been called and we have already detached ourselves. |
- if (!webViewClient) |
- ASSERT(!m_bridgeId); |
- else if (m_bridgeId) |
- webViewClient->geolocationService()->detachBridge(m_bridgeId); |
+ if (isAttached()) |
+ m_webGeolocationService->detachBridge(m_bridgeId); |
} |
bool WebGeolocationServiceBridgeImpl::startUpdating(PositionOptions* positionOptions) |
{ |
attachBridgeIfNeeded(); |
- getWebViewClient()->geolocationService()->startUpdating(m_bridgeId, m_GeolocationServiceChromium->frame()->document()->url(), positionOptions->enableHighAccuracy()); |
+ if (!isAttached()) |
+ return false; |
+ m_webGeolocationService->startUpdating(m_bridgeId, m_geolocationServiceChromium->frame()->document()->url(), positionOptions->enableHighAccuracy()); |
return true; |
} |
void WebGeolocationServiceBridgeImpl::stopUpdating() |
{ |
- WebViewClient* webViewClient = getWebViewClient(); |
- if (m_bridgeId && webViewClient) { |
- WebGeolocationService* geolocationService = webViewClient->geolocationService(); |
- geolocationService->stopUpdating(m_bridgeId); |
- geolocationService->detachBridge(m_bridgeId); |
+ if (isAttached()) { |
+ m_webGeolocationService->stopUpdating(m_bridgeId); |
+ m_webGeolocationService->detachBridge(m_bridgeId); |
+ m_bridgeId = 0; |
+ m_webGeolocationService = 0; |
} |
- m_bridgeId = 0; |
} |
void WebGeolocationServiceBridgeImpl::suspend() |
{ |
- getWebViewClient()->geolocationService()->suspend(m_bridgeId); |
+ if (isAttached()) |
+ m_webGeolocationService->suspend(m_bridgeId); |
} |
void WebGeolocationServiceBridgeImpl::resume() |
{ |
- getWebViewClient()->geolocationService()->resume(m_bridgeId); |
+ if (isAttached()) |
+ m_webGeolocationService->resume(m_bridgeId); |
} |
int WebGeolocationServiceBridgeImpl::getBridgeId() const |
@@ -147,38 +147,54 @@ |
void WebGeolocationServiceBridgeImpl::attachBridgeIfNeeded() |
{ |
- if (!m_bridgeId) |
- m_bridgeId = getWebViewClient()->geolocationService()->attachBridge(this); |
+ 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); |
+ 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); |
+ m_geolocationServiceChromium->setLastPosition(geoposition); |
} |
void WebGeolocationServiceBridgeImpl::setLastError(int errorCode, const WebString& message) |
{ |
- m_GeolocationServiceChromium->setLastError(errorCode, message); |
+ m_geolocationServiceChromium->setLastError(errorCode, message); |
} |
-WebViewClient* WebGeolocationServiceBridgeImpl::getWebViewClient() |
+void WebGeolocationServiceBridgeImpl::onWebGeolocationServiceDestroyed() |
{ |
- Frame* frame = m_GeolocationServiceChromium->frame(); |
- if (!frame || !frame->page()) |
- return 0; |
- WebKit::ChromeClientImpl* chromeClientImpl = static_cast<WebKit::ChromeClientImpl*>(frame->page()->chrome()->client()); |
- WebKit::WebViewClient* webViewClient = chromeClientImpl->webView()->client(); |
- return webViewClient; |
+ m_bridgeId = 0; |
+ m_webGeolocationService = 0; |
} |
-void WebGeolocationServiceBridgeImpl::onWebGeolocationServiceDestroyed() |
+bool WebGeolocationServiceBridgeImpl::isAttached() const |
{ |
+ // Test the class invariant. |
+ if (m_webGeolocationService) |
+ ASSERT(m_bridgeId); |
+ else |
+ ASSERT(!m_bridgeId); |
+ |
+ return m_webGeolocationService; |
} |
} // namespace WebKit |