15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/js/sync_js_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/js/js_backend.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/js/js_event_details.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncJsController::SyncJsController() {} 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncJsController::~SyncJsController() { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AttachJsBackend(WeakHandle<JsBackend>()); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncJsController::AddJsEventHandler(JsEventHandler* event_handler) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) js_event_handlers_.AddObserver(event_handler); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBackendEventHandler(); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncJsController::RemoveJsEventHandler(JsEventHandler* event_handler) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) js_event_handlers_.RemoveObserver(event_handler); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBackendEventHandler(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncJsController::AttachJsBackend( 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WeakHandle<JsBackend>& js_backend) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) js_backend_ = js_backend; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBackendEventHandler(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncJsController::HandleJsEvent(const std::string& name, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const JsEventDetails& details) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(JsEventHandler, js_event_handlers_, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleJsEvent(name, details)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncJsController::UpdateBackendEventHandler() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (js_backend_.IsInitialized()) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid making the backend send useless events, we clear the 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event handler we pass to it if we don't have any event 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handlers. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WeakHandle<JsEventHandler> backend_event_handler = 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) js_event_handlers_.might_have_observers() ? 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeWeakHandle(AsWeakPtr()) : WeakHandle<SyncJsController>(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) js_backend_.Call(FROM_HERE, &JsBackend::SetJsEventHandler, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_event_handler); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 55